Skip to content

Commit fab1aad

Browse files
committed
Enable FoldOpIntoSelect when the Op's other parameter is non-const
1 parent 8e6ef2d commit fab1aad

File tree

9 files changed

+33
-154
lines changed

9 files changed

+33
-154
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2261,11 +2261,11 @@ Instruction *InstCombinerImpl::foldBinopWithPhiOperands(BinaryOperator &BO) {
22612261
}
22622262

22632263
Instruction *InstCombinerImpl::foldBinOpIntoSelectOrPhi(BinaryOperator &I) {
2264-
if (!isa<Constant>(I.getOperand(1)))
2265-
return nullptr;
2264+
bool IsOtherParamConst = isa<Constant>(I.getOperand(1));
22662265

22672266
if (auto *Sel = dyn_cast<SelectInst>(I.getOperand(0))) {
2268-
if (Instruction *NewSel = FoldOpIntoSelect(I, Sel))
2267+
if (Instruction *NewSel =
2268+
FoldOpIntoSelect(I, Sel, false, !IsOtherParamConst))
22692269
return NewSel;
22702270
} else if (auto *PN = dyn_cast<PHINode>(I.getOperand(0))) {
22712271
if (Instruction *NewPhi = foldOpIntoPhi(I, PN))

llvm/test/Transforms/InstCombine/binop-phi-operands.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -653,12 +653,11 @@ define i8 @mul_const_incoming0_speculatable(i1 %b, i8 %x, i8 %y) {
653653
; CHECK-NEXT: entry:
654654
; CHECK-NEXT: br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
655655
; CHECK: if:
656+
; CHECK-NEXT: [[TMP0:%.*]] = mul i8 [[X:%.*]], [[Y:%.*]]
656657
; CHECK-NEXT: br label [[THEN]]
657658
; CHECK: then:
658-
; CHECK-NEXT: [[P0:%.*]] = phi i8 [ 42, [[ENTRY:%.*]] ], [ [[X:%.*]], [[IF]] ]
659-
; CHECK-NEXT: [[P1:%.*]] = phi i8 [ 17, [[ENTRY]] ], [ [[Y:%.*]], [[IF]] ]
659+
; CHECK-NEXT: [[R:%.*]] = phi i8 [ -54, [[ENTRY:%.*]] ], [ [[TMP0]], [[IF]] ]
660660
; CHECK-NEXT: call void @sideeffect()
661-
; CHECK-NEXT: [[R:%.*]] = mul i8 [[P0]], [[P1]]
662661
; CHECK-NEXT: ret i8 [[R]]
663662
;
664663
entry:

llvm/test/Transforms/InstCombine/binop-select.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ define i32 @sub_sel_op1_use(i1 %b) {
335335

336336
define float @fadd_sel_op0(i1 %b, float %x) {
337337
; CHECK-LABEL: @fadd_sel_op0(
338-
; CHECK-NEXT: [[R:%.*]] = select nnan i1 [[B:%.*]], float 0xFFF0000000000000, float 0x7FF0000000000000
338+
; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], float 0xFFF0000000000000, float 0x7FF0000000000000
339339
; CHECK-NEXT: ret float [[R]]
340340
;
341341
%s = select i1 %b, float 0xFFF0000000000000, float 0x7FF0000000000000

llvm/test/Transforms/InstCombine/dont-distribute-phi.ll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
define zeroext i1 @foo(i32 %arg) {
88
; CHECK-LABEL: @foo(
99
; CHECK-NEXT: entry:
10-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[ARG:%.*]], 37
10+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[ARG:%.*]], 37
1111
; CHECK-NEXT: br i1 [[CMP1]], label [[BB_ELSE:%.*]], label [[BB_THEN:%.*]]
1212
; CHECK: bb_then:
1313
; CHECK-NEXT: call void @bar()
@@ -16,8 +16,7 @@ define zeroext i1 @foo(i32 %arg) {
1616
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[ARG]], 17
1717
; CHECK-NEXT: br label [[BB_EXIT]]
1818
; CHECK: bb_exit:
19-
; CHECK-NEXT: [[PHI1:%.*]] = phi i1 [ [[CMP2]], [[BB_ELSE]] ], [ undef, [[BB_THEN]] ]
20-
; CHECK-NEXT: [[AND1:%.*]] = and i1 [[PHI1]], [[CMP1]]
19+
; CHECK-NEXT: [[AND1:%.*]] = phi i1 [ [[CMP2]], [[BB_THEN]] ], [ false, [[BB_ELSE]] ]
2120
; CHECK-NEXT: ret i1 [[AND1]]
2221
;
2322

@@ -43,7 +42,7 @@ bb_exit:
4342
define zeroext i1 @foo_logical(i32 %arg) {
4443
; CHECK-LABEL: @foo_logical(
4544
; CHECK-NEXT: entry:
46-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[ARG:%.*]], 37
45+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[ARG:%.*]], 37
4746
; CHECK-NEXT: br i1 [[CMP1]], label [[BB_ELSE:%.*]], label [[BB_THEN:%.*]]
4847
; CHECK: bb_then:
4948
; CHECK-NEXT: call void @bar()
@@ -52,8 +51,7 @@ define zeroext i1 @foo_logical(i32 %arg) {
5251
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[ARG]], 17
5352
; CHECK-NEXT: br label [[BB_EXIT]]
5453
; CHECK: bb_exit:
55-
; CHECK-NEXT: [[PHI1:%.*]] = phi i1 [ [[CMP2]], [[BB_ELSE]] ], [ undef, [[BB_THEN]] ]
56-
; CHECK-NEXT: [[AND1:%.*]] = and i1 [[PHI1]], [[CMP1]]
54+
; CHECK-NEXT: [[AND1:%.*]] = phi i1 [ [[CMP2]], [[BB_THEN]] ], [ false, [[BB_ELSE]] ]
5755
; CHECK-NEXT: ret i1 [[AND1]]
5856
;
5957

llvm/test/Transforms/InstCombine/fmul.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,7 +1222,7 @@ define <2 x double> @negate_if_true_wrong_constant(<2 x double> %px, i1 %cond) {
12221222
; X *fast (C ? 1.0 : 0.0) -> C ? X : 0.0
12231223
define float @fmul_select(float %x, i1 %c) {
12241224
; CHECK-LABEL: @fmul_select(
1225-
; CHECK-NEXT: [[MUL:%.*]] = select fast i1 [[C:%.*]], float [[X:%.*]], float 0.000000e+00
1225+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[C:%.*]], float [[X:%.*]], float 0.000000e+00
12261226
; CHECK-NEXT: ret float [[MUL]]
12271227
;
12281228
%sel = select i1 %c, float 1.0, float 0.0
@@ -1233,7 +1233,7 @@ define float @fmul_select(float %x, i1 %c) {
12331233
; X *fast (C ? 1.0 : 0.0) -> C ? X : 0.0
12341234
define <2 x float> @fmul_select_vec(<2 x float> %x, i1 %c) {
12351235
; CHECK-LABEL: @fmul_select_vec(
1236-
; CHECK-NEXT: [[MUL:%.*]] = select fast i1 [[C:%.*]], <2 x float> [[X:%.*]], <2 x float> zeroinitializer
1236+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[C:%.*]], <2 x float> [[X:%.*]], <2 x float> zeroinitializer
12371237
; CHECK-NEXT: ret <2 x float> [[MUL]]
12381238
;
12391239
%sel = select i1 %c, <2 x float> <float 1.0, float 1.0>, <2 x float> zeroinitializer

llvm/test/Transforms/InstCombine/free-inversion.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -563,10 +563,10 @@ define i1 @test_inv_free(i1 %c1, i1 %c2, i1 %c3, i1 %c4) {
563563
; CHECK: b2:
564564
; CHECK-NEXT: br label [[EXIT]]
565565
; CHECK: b3:
566+
; CHECK-NEXT: [[TMP0:%.*]] = and i1 [[C3:%.*]], [[C4:%.*]]
566567
; CHECK-NEXT: br label [[EXIT]]
567568
; CHECK: exit:
568-
; CHECK-NEXT: [[VAL_NOT:%.*]] = phi i1 [ false, [[B1]] ], [ true, [[B2]] ], [ [[C3:%.*]], [[B3]] ]
569-
; CHECK-NEXT: [[COND_NOT:%.*]] = and i1 [[VAL_NOT]], [[C4:%.*]]
569+
; CHECK-NEXT: [[COND_NOT:%.*]] = phi i1 [ false, [[B1]] ], [ [[C4]], [[B2]] ], [ [[TMP0]], [[B3]] ]
570570
; CHECK-NEXT: br i1 [[COND_NOT]], label [[B5:%.*]], label [[B4:%.*]]
571571
; CHECK: b4:
572572
; CHECK-NEXT: ret i1 true

llvm/test/Transforms/InstCombine/recurrence.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ loop: ; preds = %loop, %entry
2424
define i64 @test_or2(i64 %a, i64 %b) {
2525
; CHECK-LABEL: @test_or2(
2626
; CHECK-NEXT: entry:
27+
; CHECK-NEXT: [[IV_NEXT:%.*]] = or i64 [[A:%.*]], [[B:%.*]]
2728
; CHECK-NEXT: br label [[LOOP:%.*]]
2829
; CHECK: loop:
29-
; CHECK-NEXT: [[IV_NEXT:%.*]] = or i64 [[A:%.*]], [[B:%.*]]
3030
; CHECK-NEXT: tail call void @use(i64 [[IV_NEXT]])
3131
; CHECK-NEXT: br label [[LOOP]]
3232
;
@@ -104,9 +104,9 @@ loop: ; preds = %loop, %entry
104104
define i64 @test_and2(i64 %a, i64 %b) {
105105
; CHECK-LABEL: @test_and2(
106106
; CHECK-NEXT: entry:
107+
; CHECK-NEXT: [[IV_NEXT:%.*]] = and i64 [[A:%.*]], [[B:%.*]]
107108
; CHECK-NEXT: br label [[LOOP:%.*]]
108109
; CHECK: loop:
109-
; CHECK-NEXT: [[IV_NEXT:%.*]] = and i64 [[A:%.*]], [[B:%.*]]
110110
; CHECK-NEXT: tail call void @use(i64 [[IV_NEXT]])
111111
; CHECK-NEXT: br label [[LOOP]]
112112
;

llvm/test/Transforms/InstCombine/sub-gep.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -858,8 +858,7 @@ define i1 @_gep_phi2(ptr %str1, i64 %val2) {
858858
; CHECK: while.end.i:
859859
; CHECK-NEXT: br label [[_Z3FOOPKC_EXIT]]
860860
; CHECK: _Z3fooPKc.exit:
861-
; CHECK-NEXT: [[RETVAL_0_I:%.*]] = phi i64 [ 1, [[WHILE_END_I]] ], [ 0, [[LOR_LHS_FALSE_I]] ], [ 0, [[ENTRY:%.*]] ]
862-
; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[RETVAL_0_I]], [[VAL2:%.*]]
861+
; CHECK-NEXT: [[TMP2:%.*]] = phi i64 [ 1, [[WHILE_END_I]] ], [ [[VAL2:%.*]], [[LOR_LHS_FALSE_I]] ], [ [[VAL2]], [[ENTRY:%.*]] ]
863862
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[TMP2]], 0
864863
; CHECK-NEXT: ret i1 [[TOBOOL]]
865864
;

0 commit comments

Comments
 (0)