Skip to content

Commit 9cd7c53

Browse files
committed
[InstCombine] Enable fold select into operand for FAdd, FMul, FSub and FDiv.
For FAdd, FMul, FSub and FDiv, fold select into one of the operands to enable further optimizations, i.e., floating-point reduction detection. Turn code: %C = fadd %A, %B %D = select %cond, %C, %A into: %C = select %cond, %B, -0.000000e+00 %D = fadd %A, %C Alive2 verification (with --disable-undef-input), timed out otherwise. FAdd - https://alive2.llvm.org/ce/z/eUxN4Y FMul - https://alive2.llvm.org/ce/z/5SWZz4 FSub - https://alive2.llvm.org/ce/z/Dhj8dU FDiv - https://alive2.llvm.org/ce/z/Yj_NA2 Reviewed By: spatel Differential Revision: https://reviews.llvm.org/D113442
1 parent d02b318 commit 9cd7c53

File tree

6 files changed

+68
-64
lines changed

6 files changed

+68
-64
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,12 +246,16 @@ static Value *foldSelectICmpAnd(SelectInst &Sel, ICmpInst *Cmp,
246246
static unsigned getSelectFoldableOperands(BinaryOperator *I) {
247247
switch (I->getOpcode()) {
248248
case Instruction::Add:
249+
case Instruction::FAdd:
249250
case Instruction::Mul:
251+
case Instruction::FMul:
250252
case Instruction::And:
251253
case Instruction::Or:
252254
case Instruction::Xor:
253255
return 3; // Can fold through either operand.
254256
case Instruction::Sub: // Can only fold on the amount subtracted.
257+
case Instruction::FSub:
258+
case Instruction::FDiv: // Can only fold on the divisor amount.
255259
case Instruction::Shl: // Can only fold on the shift amount.
256260
case Instruction::LShr:
257261
case Instruction::AShr:

llvm/test/Transforms/InstCombine/select-binop-foldable-floating-point.ll

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
define float @select_fadd(i1 %cond, float %A, float %B) {
55
; CHECK-LABEL: @select_fadd(
6-
; CHECK-NEXT: [[C:%.*]] = fadd float [[A:%.*]], [[B:%.*]]
7-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
6+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
7+
; CHECK-NEXT: [[D:%.*]] = fadd float [[C]], [[A:%.*]]
88
; CHECK-NEXT: ret float [[D]]
99
;
1010
%C = fadd float %A, %B
@@ -14,8 +14,8 @@ define float @select_fadd(i1 %cond, float %A, float %B) {
1414

1515
define float @select_fadd_swapped(i1 %cond, float %A, float %B) {
1616
; CHECK-LABEL: @select_fadd_swapped(
17-
; CHECK-NEXT: [[C:%.*]] = fadd float [[A:%.*]], [[B:%.*]]
18-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[A]], float [[C]]
17+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float -0.000000e+00, float [[B:%.*]]
18+
; CHECK-NEXT: [[D:%.*]] = fadd float [[C]], [[A:%.*]]
1919
; CHECK-NEXT: ret float [[D]]
2020
;
2121
%C = fadd float %A, %B
@@ -25,8 +25,8 @@ define float @select_fadd_swapped(i1 %cond, float %A, float %B) {
2525

2626
define float @select_fadd_fast_math(i1 %cond, float %A, float %B) {
2727
; CHECK-LABEL: @select_fadd_fast_math(
28-
; CHECK-NEXT: [[C:%.*]] = fadd fast float [[A:%.*]], [[B:%.*]]
29-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
28+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
29+
; CHECK-NEXT: [[D:%.*]] = fadd fast float [[C]], [[A:%.*]]
3030
; CHECK-NEXT: ret float [[D]]
3131
;
3232
%C = fadd fast float %A, %B
@@ -36,8 +36,8 @@ define float @select_fadd_fast_math(i1 %cond, float %A, float %B) {
3636

3737
define float @select_fadd_swapped_fast_math(i1 %cond, float %A, float %B) {
3838
; CHECK-LABEL: @select_fadd_swapped_fast_math(
39-
; CHECK-NEXT: [[C:%.*]] = fadd fast float [[A:%.*]], [[B:%.*]]
40-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[A]], float [[C]]
39+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float -0.000000e+00, float [[B:%.*]]
40+
; CHECK-NEXT: [[D:%.*]] = fadd fast float [[C]], [[A:%.*]]
4141
; CHECK-NEXT: ret float [[D]]
4242
;
4343
%C = fadd fast float %A, %B
@@ -47,8 +47,8 @@ define float @select_fadd_swapped_fast_math(i1 %cond, float %A, float %B) {
4747

4848
define float @select_fmul(i1 %cond, float %A, float %B) {
4949
; CHECK-LABEL: @select_fmul(
50-
; CHECK-NEXT: [[C:%.*]] = fmul float [[A:%.*]], [[B:%.*]]
51-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
50+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
51+
; CHECK-NEXT: [[D:%.*]] = fmul float [[C]], [[A:%.*]]
5252
; CHECK-NEXT: ret float [[D]]
5353
;
5454
%C = fmul float %A, %B
@@ -58,8 +58,8 @@ define float @select_fmul(i1 %cond, float %A, float %B) {
5858

5959
define float @select_fmul_swapped(i1 %cond, float %A, float %B) {
6060
; CHECK-LABEL: @select_fmul_swapped(
61-
; CHECK-NEXT: [[C:%.*]] = fmul float [[A:%.*]], [[B:%.*]]
62-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[A]], float [[C]]
61+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
62+
; CHECK-NEXT: [[D:%.*]] = fmul float [[C]], [[A:%.*]]
6363
; CHECK-NEXT: ret float [[D]]
6464
;
6565
%C = fmul float %A, %B
@@ -69,8 +69,8 @@ define float @select_fmul_swapped(i1 %cond, float %A, float %B) {
6969

7070
define float @select_fmul_fast_math(i1 %cond, float %A, float %B) {
7171
; CHECK-LABEL: @select_fmul_fast_math(
72-
; CHECK-NEXT: [[C:%.*]] = fmul fast float [[A:%.*]], [[B:%.*]]
73-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
72+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
73+
; CHECK-NEXT: [[D:%.*]] = fmul fast float [[C]], [[A:%.*]]
7474
; CHECK-NEXT: ret float [[D]]
7575
;
7676
%C = fmul fast float %A, %B
@@ -80,8 +80,8 @@ define float @select_fmul_fast_math(i1 %cond, float %A, float %B) {
8080

8181
define float @select_fmul_swapped_fast_math(i1 %cond, float %A, float %B) {
8282
; CHECK-LABEL: @select_fmul_swapped_fast_math(
83-
; CHECK-NEXT: [[C:%.*]] = fmul fast float [[A:%.*]], [[B:%.*]]
84-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[A]], float [[C]]
83+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
84+
; CHECK-NEXT: [[D:%.*]] = fmul fast float [[C]], [[A:%.*]]
8585
; CHECK-NEXT: ret float [[D]]
8686
;
8787
%C = fmul fast float %A, %B
@@ -91,8 +91,8 @@ define float @select_fmul_swapped_fast_math(i1 %cond, float %A, float %B) {
9191

9292
define float @select_fsub(i1 %cond, float %A, float %B) {
9393
; CHECK-LABEL: @select_fsub(
94-
; CHECK-NEXT: [[C:%.*]] = fsub float [[A:%.*]], [[B:%.*]]
95-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
94+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
95+
; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]
9696
; CHECK-NEXT: ret float [[D]]
9797
;
9898
%C = fsub float %A, %B
@@ -102,8 +102,8 @@ define float @select_fsub(i1 %cond, float %A, float %B) {
102102

103103
define float @select_fsub_swapped(i1 %cond, float %A, float %B) {
104104
; CHECK-LABEL: @select_fsub_swapped(
105-
; CHECK-NEXT: [[C:%.*]] = fsub float [[A:%.*]], [[B:%.*]]
106-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[A]], float [[C]]
105+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 0.000000e+00, float [[B:%.*]]
106+
; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]
107107
; CHECK-NEXT: ret float [[D]]
108108
;
109109
%C = fsub float %A, %B
@@ -113,8 +113,8 @@ define float @select_fsub_swapped(i1 %cond, float %A, float %B) {
113113

114114
define float @select_fsub_fast_math(i1 %cond, float %A, float %B) {
115115
; CHECK-LABEL: @select_fsub_fast_math(
116-
; CHECK-NEXT: [[C:%.*]] = fsub fast float [[A:%.*]], [[B:%.*]]
117-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
116+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
117+
; CHECK-NEXT: [[D:%.*]] = fsub fast float [[A:%.*]], [[C]]
118118
; CHECK-NEXT: ret float [[D]]
119119
;
120120
%C = fsub fast float %A, %B
@@ -124,8 +124,8 @@ define float @select_fsub_fast_math(i1 %cond, float %A, float %B) {
124124

125125
define float @select_fsub_swapped_fast_math(i1 %cond, float %A, float %B) {
126126
; CHECK-LABEL: @select_fsub_swapped_fast_math(
127-
; CHECK-NEXT: [[C:%.*]] = fsub fast float [[A:%.*]], [[B:%.*]]
128-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[A]], float [[C]]
127+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 0.000000e+00, float [[B:%.*]]
128+
; CHECK-NEXT: [[D:%.*]] = fsub fast float [[A:%.*]], [[C]]
129129
; CHECK-NEXT: ret float [[D]]
130130
;
131131
%C = fsub fast float %A, %B
@@ -147,8 +147,8 @@ define float @select_fsub_invalid(i1 %cond, float %A, float %B) {
147147

148148
define float @select_fdiv(i1 %cond, float %A, float %B) {
149149
; CHECK-LABEL: @select_fdiv(
150-
; CHECK-NEXT: [[C:%.*]] = fdiv float [[A:%.*]], [[B:%.*]]
151-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
150+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
151+
; CHECK-NEXT: [[D:%.*]] = fdiv float [[A:%.*]], [[C]]
152152
; CHECK-NEXT: ret float [[D]]
153153
;
154154
%C = fdiv float %A, %B
@@ -158,8 +158,8 @@ define float @select_fdiv(i1 %cond, float %A, float %B) {
158158

159159
define float @select_fdiv_swapped(i1 %cond, float %A, float %B) {
160160
; CHECK-LABEL: @select_fdiv_swapped(
161-
; CHECK-NEXT: [[C:%.*]] = fdiv float [[A:%.*]], [[B:%.*]]
162-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[A]], float [[C]]
161+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
162+
; CHECK-NEXT: [[D:%.*]] = fdiv float [[A:%.*]], [[C]]
163163
; CHECK-NEXT: ret float [[D]]
164164
;
165165
%C = fdiv float %A, %B
@@ -169,8 +169,8 @@ define float @select_fdiv_swapped(i1 %cond, float %A, float %B) {
169169

170170
define float @select_fdiv_fast_math(i1 %cond, float %A, float %B) {
171171
; CHECK-LABEL: @select_fdiv_fast_math(
172-
; CHECK-NEXT: [[C:%.*]] = fdiv fast float [[A:%.*]], [[B:%.*]]
173-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
172+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
173+
; CHECK-NEXT: [[D:%.*]] = fdiv fast float [[A:%.*]], [[C]]
174174
; CHECK-NEXT: ret float [[D]]
175175
;
176176
%C = fdiv fast float %A, %B
@@ -180,8 +180,8 @@ define float @select_fdiv_fast_math(i1 %cond, float %A, float %B) {
180180

181181
define float @select_fdiv_swapped_fast_math(i1 %cond, float %A, float %B) {
182182
; CHECK-LABEL: @select_fdiv_swapped_fast_math(
183-
; CHECK-NEXT: [[C:%.*]] = fdiv fast float [[A:%.*]], [[B:%.*]]
184-
; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[A]], float [[C]]
183+
; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
184+
; CHECK-NEXT: [[D:%.*]] = fdiv fast float [[A:%.*]], [[C]]
185185
; CHECK-NEXT: ret float [[D]]
186186
;
187187
%C = fdiv fast float %A, %B

llvm/test/Transforms/LoopVectorize/ARM/mve-selectandorcost.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ define float @test(float* nocapture readonly %pA, float* nocapture readonly %pB,
4343
; CHECK-NEXT: [[TMP8:%.*]] = fsub fast <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD6]]
4444
; CHECK-NEXT: [[TMP9:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP8]])
4545
; CHECK-NEXT: [[TMP10:%.*]] = fdiv fast <4 x float> [[TMP9]], [[TMP7]]
46-
; CHECK-NEXT: [[TMP11:%.*]] = fadd fast <4 x float> [[TMP10]], [[VEC_PHI]]
47-
; CHECK-NEXT: [[PREDPHI]] = select <4 x i1> [[TMP4]], <4 x float> [[VEC_PHI]], <4 x float> [[TMP11]]
46+
; CHECK-NEXT: [[TMP11:%.*]] = select <4 x i1> [[TMP4]], <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, <4 x float> [[TMP10]]
47+
; CHECK-NEXT: [[PREDPHI]] = fadd fast <4 x float> [[VEC_PHI]], [[TMP11]]
4848
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
4949
; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
5050
; CHECK-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]

llvm/test/Transforms/LoopVectorize/reduction-inloop-pred.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -959,7 +959,7 @@ define float @reduction_fadd(float* nocapture %A, float* nocapture %B) {
959959
; CHECK: vector.body:
960960
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]
961961
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]
962-
; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP45:%.*]], [[PRED_LOAD_CONTINUE6]] ]
962+
; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP43:%.*]], [[PRED_LOAD_CONTINUE6]] ]
963963
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i64> [[VEC_IND]], <i64 257, i64 257, i64 257, i64 257>
964964
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i32 0
965965
; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
@@ -1019,7 +1019,7 @@ define float @reduction_fadd(float* nocapture %A, float* nocapture %B) {
10191019
; CHECK-NEXT: [[TMP40:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP38]], <4 x float> zeroinitializer
10201020
; CHECK-NEXT: [[TMP41:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float [[VEC_PHI]], <4 x float> [[TMP40]])
10211021
; CHECK-NEXT: [[TMP42:%.*]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP39]], <4 x float> zeroinitializer
1022-
; CHECK-NEXT: [[TMP43:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float [[TMP41]], <4 x float> [[TMP42]])
1022+
; CHECK-NEXT: [[TMP43]] = call fast float @llvm.vector.reduce.fadd.v4f32(float [[TMP41]], <4 x float> [[TMP42]])
10231023
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4
10241024
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], <i64 4, i64 4, i64 4, i64 4>
10251025
; CHECK-NEXT: [[TMP44:%.*]] = icmp eq i64 [[INDEX_NEXT]], 260
@@ -1366,9 +1366,9 @@ define float @reduction_conditional(float* %A, float* %B, float* %C, float %S) {
13661366
; CHECK-NEXT: [[TMP11:%.*]] = and <4 x i1> [[TMP8]], [[TMP10]]
13671367
; CHECK-NEXT: [[TMP12:%.*]] = xor <4 x i1> [[TMP5]], <i1 true, i1 true, i1 true, i1 true>
13681368
; CHECK-NEXT: [[PREDPHI_V:%.*]] = select <4 x i1> [[TMP9]], <4 x float> [[WIDE_LOAD1]], <4 x float> [[WIDE_LOAD]]
1369-
; CHECK-NEXT: [[PREDPHI:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[PREDPHI_V]]
13701369
; CHECK-NEXT: [[TMP13:%.*]] = select <4 x i1> [[TMP12]], <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> [[TMP11]]
1371-
; CHECK-NEXT: [[PREDPHI3]] = select <4 x i1> [[TMP13]], <4 x float> [[VEC_PHI]], <4 x float> [[PREDPHI]]
1370+
; CHECK-NEXT: [[PREDPHI2:%.*]] = select <4 x i1> [[TMP13]], <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, <4 x float> [[PREDPHI_V]]
1371+
; CHECK-NEXT: [[PREDPHI3]] = fadd fast <4 x float> [[VEC_PHI]], [[PREDPHI2]]
13721372
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
13731373
; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128
13741374
; CHECK-NEXT: br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]

0 commit comments

Comments
 (0)