Skip to content

Commit 6c8b945

Browse files
committed
[InstCombinePHI] Remove dead PHI on UnaryOperator
1 parent ba13978 commit 6c8b945

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1440,7 +1440,8 @@ Instruction *InstCombinerImpl::visitPHINode(PHINode &PN) {
14401440
// are induction variable analysis (sometimes) and ADCE, which is only run
14411441
// late.
14421442
if (PHIUser->hasOneUse() &&
1443-
(isa<BinaryOperator>(PHIUser) || isa<GetElementPtrInst>(PHIUser)) &&
1443+
(isa<BinaryOperator>(PHIUser) || isa<UnaryOperator>(PHIUser) ||
1444+
isa<GetElementPtrInst>(PHIUser)) &&
14441445
PHIUser->user_back() == &PN) {
14451446
return replaceInstUsesWith(PN, PoisonValue::get(PN.getType()));
14461447
}

llvm/test/Transforms/InstCombine/phi.ll

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,27 @@ Exit: ; preds = %Loop
154154
ret i32 0
155155
}
156156

157+
define i32 @test_dead_UnaryOp_cycle(double %A, i1 %cond) {
158+
; CHECK-LABEL: @test_dead_UnaryOp_cycle(
159+
; CHECK-NEXT: BB0:
160+
; CHECK-NEXT: br label [[LOOP:%.*]]
161+
; CHECK: Loop:
162+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP]], label [[EXIT:%.*]]
163+
; CHECK: Exit:
164+
; CHECK-NEXT: ret i32 0
165+
;
166+
BB0:
167+
br label %Loop
168+
169+
Loop: ; preds = %Loop, %BB0
170+
%B = phi double [ %A, %BB0 ], [ %C, %Loop ]
171+
%C = fneg double %B
172+
br i1 %cond, label %Loop, label %Exit
173+
174+
Exit: ; preds = %Loop
175+
ret i32 0
176+
}
177+
157178
define i32 @test_dead_cycle_two_insts(i32 %A, i1 %cond) {
158179
; CHECK-LABEL: @test_dead_cycle_two_insts(
159180
; CHECK-NEXT: BB0:
@@ -901,14 +922,14 @@ define i1 @test26(i32 %n) {
901922
; CHECK: one:
902923
; CHECK-NEXT: [[C:%.*]] = call i1 @test26a()
903924
; CHECK-NEXT: switch i32 [[N:%.*]], label [[END:%.*]] [
904-
; CHECK-NEXT: i32 2, label [[TWO:%.*]]
905-
; CHECK-NEXT: i32 3, label [[THREE:%.*]]
925+
; CHECK-NEXT: i32 2, label [[TWO:%.*]]
926+
; CHECK-NEXT: i32 3, label [[THREE:%.*]]
906927
; CHECK-NEXT: ]
907928
; CHECK: two:
908929
; CHECK-NEXT: [[D:%.*]] = call i1 @test26a()
909930
; CHECK-NEXT: switch i32 [[N]], label [[END]] [
910-
; CHECK-NEXT: i32 10, label [[ONE]]
911-
; CHECK-NEXT: i32 30, label [[THREE]]
931+
; CHECK-NEXT: i32 10, label [[ONE]]
932+
; CHECK-NEXT: i32 30, label [[THREE]]
912933
; CHECK-NEXT: ]
913934
; CHECK: three:
914935
; CHECK-NEXT: [[E:%.*]] = call i1 @test26a()
@@ -977,8 +998,8 @@ define i1 @PR24766(i8 %x1, i8 %x2, i8 %condition) {
977998
; CHECK-NEXT: entry:
978999
; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[CONDITION:%.*]] to i32
9791000
; CHECK-NEXT: switch i32 [[CONV]], label [[EPILOG:%.*]] [
980-
; CHECK-NEXT: i32 0, label [[SW1:%.*]]
981-
; CHECK-NEXT: i32 1, label [[SW2:%.*]]
1001+
; CHECK-NEXT: i32 0, label [[SW1:%.*]]
1002+
; CHECK-NEXT: i32 1, label [[SW2:%.*]]
9821003
; CHECK-NEXT: ]
9831004
; CHECK: sw1:
9841005
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X1:%.*]], [[X2:%.*]]
@@ -1021,8 +1042,8 @@ define i1 @PR24766_no_constants(i8 %x1, i8 %x2, i8 %condition, i1 %another_condi
10211042
; CHECK-NEXT: entry:
10221043
; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[CONDITION:%.*]] to i32
10231044
; CHECK-NEXT: switch i32 [[CONV]], label [[EPILOG:%.*]] [
1024-
; CHECK-NEXT: i32 0, label [[SW1:%.*]]
1025-
; CHECK-NEXT: i32 1, label [[SW2:%.*]]
1045+
; CHECK-NEXT: i32 0, label [[SW1:%.*]]
1046+
; CHECK-NEXT: i32 1, label [[SW2:%.*]]
10261047
; CHECK-NEXT: ]
10271048
; CHECK: sw1:
10281049
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X1:%.*]], [[X2:%.*]]
@@ -1066,8 +1087,8 @@ define i1 @PR24766_two_constants(i8 %x1, i8 %x2, i8 %condition) {
10661087
; CHECK-NEXT: entry:
10671088
; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[CONDITION:%.*]] to i32
10681089
; CHECK-NEXT: switch i32 [[CONV]], label [[EPILOG:%.*]] [
1069-
; CHECK-NEXT: i32 0, label [[SW1:%.*]]
1070-
; CHECK-NEXT: i32 1, label [[SW2:%.*]]
1090+
; CHECK-NEXT: i32 0, label [[SW1:%.*]]
1091+
; CHECK-NEXT: i32 1, label [[SW2:%.*]]
10711092
; CHECK-NEXT: ]
10721093
; CHECK: sw1:
10731094
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X1:%.*]], [[X2:%.*]]
@@ -1109,9 +1130,9 @@ define i1 @PR24766_two_constants_two_var(i8 %x1, i8 %x2, i8 %condition) {
11091130
; CHECK-NEXT: entry:
11101131
; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[CONDITION:%.*]] to i32
11111132
; CHECK-NEXT: switch i32 [[CONV]], label [[EPILOG:%.*]] [
1112-
; CHECK-NEXT: i32 0, label [[SW1:%.*]]
1113-
; CHECK-NEXT: i32 1, label [[SW2:%.*]]
1114-
; CHECK-NEXT: i32 2, label [[SW3:%.*]]
1133+
; CHECK-NEXT: i32 0, label [[SW1:%.*]]
1134+
; CHECK-NEXT: i32 1, label [[SW2:%.*]]
1135+
; CHECK-NEXT: i32 2, label [[SW3:%.*]]
11151136
; CHECK-NEXT: ]
11161137
; CHECK: sw1:
11171138
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X1:%.*]], [[X2:%.*]]

0 commit comments

Comments
 (0)