-
Notifications
You must be signed in to change notification settings - Fork 11.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[SLP]Fix PR85082: PHI node has multiple entries.
Need to record casted extractelement for the externally used scalar, not original extract instruction.
- Loading branch information
1 parent
b966b22
commit 4dd186a
Showing
2 changed files
with
95 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
75 changes: 75 additions & 0 deletions
75
llvm/test/Transforms/SLPVectorizer/X86/same-scalar-in-same-phi-extract.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 | ||
; RUN: opt -S --passes=slp-vectorizer -slp-threshold=-99999 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s | ||
|
||
define void @test(i32 %arg) { | ||
; CHECK-LABEL: define void @test( | ||
; CHECK-SAME: i32 [[ARG:%.*]]) { | ||
; CHECK-NEXT: bb: | ||
; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i32> <i32 poison, i32 0>, i32 [[ARG]], i32 0 | ||
; CHECK-NEXT: br label [[BB2:%.*]] | ||
; CHECK: bb2: | ||
; CHECK-NEXT: switch i32 0, label [[BB10:%.*]] [ | ||
; CHECK-NEXT: i32 0, label [[BB9:%.*]] | ||
; CHECK-NEXT: i32 11, label [[BB9]] | ||
; CHECK-NEXT: i32 1, label [[BB4:%.*]] | ||
; CHECK-NEXT: ] | ||
; CHECK: bb3: | ||
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i32> [[TMP0]], i32 0 | ||
; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64 | ||
; CHECK-NEXT: switch i32 0, label [[BB10]] [ | ||
; CHECK-NEXT: i32 18, label [[BB7:%.*]] | ||
; CHECK-NEXT: i32 1, label [[BB7]] | ||
; CHECK-NEXT: i32 0, label [[BB10]] | ||
; CHECK-NEXT: ] | ||
; CHECK: bb4: | ||
; CHECK-NEXT: [[TMP3:%.*]] = phi <2 x i32> [ [[TMP0]], [[BB2]] ] | ||
; CHECK-NEXT: [[TMP4:%.*]] = zext <2 x i32> [[TMP3]] to <2 x i64> | ||
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i64> [[TMP4]], i32 0 | ||
; CHECK-NEXT: [[GETELEMENTPTR:%.*]] = getelementptr i32, ptr null, i64 [[TMP5]] | ||
; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i64> [[TMP4]], i32 1 | ||
; CHECK-NEXT: [[GETELEMENTPTR6:%.*]] = getelementptr i32, ptr null, i64 [[TMP6]] | ||
; CHECK-NEXT: ret void | ||
; CHECK: bb7: | ||
; CHECK-NEXT: [[PHI8:%.*]] = phi i64 [ [[TMP2]], [[BB3:%.*]] ], [ [[TMP2]], [[BB3]] ] | ||
; CHECK-NEXT: br label [[BB9]] | ||
; CHECK: bb9: | ||
; CHECK-NEXT: ret void | ||
; CHECK: bb10: | ||
; CHECK-NEXT: ret void | ||
; | ||
bb: | ||
%zext = zext i32 %arg to i64 | ||
%zext1 = zext i32 0 to i64 | ||
br label %bb2 | ||
|
||
bb2: | ||
switch i32 0, label %bb10 [ | ||
i32 0, label %bb9 | ||
i32 11, label %bb9 | ||
i32 1, label %bb4 | ||
] | ||
|
||
bb3: | ||
switch i32 0, label %bb10 [ | ||
i32 18, label %bb7 | ||
i32 1, label %bb7 | ||
i32 0, label %bb10 | ||
] | ||
|
||
bb4: | ||
%phi = phi i64 [ %zext, %bb2 ] | ||
%phi5 = phi i64 [ %zext1, %bb2 ] | ||
%getelementptr = getelementptr i32, ptr null, i64 %phi | ||
%getelementptr6 = getelementptr i32, ptr null, i64 %phi5 | ||
ret void | ||
|
||
bb7: | ||
%phi8 = phi i64 [ %zext, %bb3 ], [ %zext, %bb3 ] | ||
br label %bb9 | ||
|
||
bb9: | ||
ret void | ||
|
||
bb10: | ||
ret void | ||
} |