Skip to content

Commit 2eb6ea7

Browse files
committed
[InstCombine] Fold fcmp into select
1 parent 3c3e7bf commit 2eb6ea7

File tree

3 files changed

+17
-18
lines changed

3 files changed

+17
-18
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8020,6 +8020,10 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80208020
if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
80218021
return NV;
80228022
break;
8023+
case Instruction::Select:
8024+
if (Instruction *NV = FoldOpIntoSelect(I, cast<SelectInst>(LHSI)))
8025+
return NV;
8026+
break;
80238027
case Instruction::SIToFP:
80248028
case Instruction::UIToFP:
80258029
if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))

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

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,7 @@ define i1 @fcmp_ogt_select(i1 %cond, float %a, float %b) {
151151

152152
define i1 @test_fcmp_select_const_const(double %x) {
153153
; CHECK-LABEL: @test_fcmp_select_const_const(
154-
; CHECK-NEXT: [[CMP2:%.*]] = fcmp ord double [[X:%.*]], 0.000000e+00
155-
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP2]], double 0xFFFFFFFFFFFFFFFF, double 0.000000e+00
156-
; CHECK-NEXT: [[CMP1:%.*]] = fcmp oeq double [[SEL]], 0.000000e+00
154+
; CHECK-NEXT: [[CMP1:%.*]] = fcmp uno double [[X:%.*]], 0.000000e+00
157155
; CHECK-NEXT: ret i1 [[CMP1]]
158156
;
159157
%cmp1 = fcmp ord double %x, 0.000000e+00
@@ -164,10 +162,10 @@ define i1 @test_fcmp_select_const_const(double %x) {
164162

165163
define i1 @test_fcmp_select_var_const(double %x, double %y) {
166164
; CHECK-LABEL: @test_fcmp_select_var_const(
167-
; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt double [[X:%.*]], 0x3E80000000000000
168-
; CHECK-NEXT: [[Y:%.*]] = select i1 [[CMP1]], double [[Y1:%.*]], double 0.000000e+00
169-
; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt double [[Y]], 0x3E80000000000000
170-
; CHECK-NEXT: ret i1 [[TMP1]]
165+
; CHECK-NEXT: [[CMP1:%.*]] = fcmp ule double [[X:%.*]], 0x3E80000000000000
166+
; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt double [[Y:%.*]], 0x3E80000000000000
167+
; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP1]], i1 true, i1 [[TMP1]]
168+
; CHECK-NEXT: ret i1 [[CMP2]]
171169
;
172170
%cmp1 = fcmp ogt double %x, 0x3E80000000000000
173171
%sel = select i1 %cmp1, double %y, double 0.000000e+00
@@ -177,10 +175,10 @@ define i1 @test_fcmp_select_var_const(double %x, double %y) {
177175

178176
define i1 @test_fcmp_select_var_const_fmf(double %x, double %y) {
179177
; CHECK-LABEL: @test_fcmp_select_var_const_fmf(
180-
; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt double [[X:%.*]], 0x3E80000000000000
181-
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], double [[Y:%.*]], double 0.000000e+00
182-
; CHECK-NEXT: [[CMP2:%.*]] = fcmp nnan olt double [[SEL]], 0x3E80000000000000
183-
; CHECK-NEXT: ret i1 [[CMP2]]
178+
; CHECK-NEXT: [[CMP1:%.*]] = fcmp ule double [[X:%.*]], 0x3E80000000000000
179+
; CHECK-NEXT: [[CMP2:%.*]] = fcmp nnan olt double [[SEL:%.*]], 0x3E80000000000000
180+
; CHECK-NEXT: [[CMP3:%.*]] = select i1 [[CMP1]], i1 true, i1 [[CMP2]]
181+
; CHECK-NEXT: ret i1 [[CMP3]]
184182
;
185183
%cmp1 = fcmp ogt double %x, 0x3E80000000000000
186184
%sel = select i1 %cmp1, double %y, double 0.000000e+00
@@ -190,9 +188,7 @@ define i1 @test_fcmp_select_var_const_fmf(double %x, double %y) {
190188

191189
define <2 x i1> @test_fcmp_select_const_const_vec(<2 x double> %x) {
192190
; CHECK-LABEL: @test_fcmp_select_const_const_vec(
193-
; CHECK-NEXT: [[CMP2:%.*]] = fcmp ord <2 x double> [[X:%.*]], zeroinitializer
194-
; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP2]], <2 x double> <double 0xFFFFFFFFFFFFFFFF, double 0xFFFFFFFFFFFFFFFF>, <2 x double> zeroinitializer
195-
; CHECK-NEXT: [[CMP1:%.*]] = fcmp oeq <2 x double> [[SEL]], zeroinitializer
191+
; CHECK-NEXT: [[CMP1:%.*]] = fcmp uno <2 x double> [[X:%.*]], zeroinitializer
196192
; CHECK-NEXT: ret <2 x i1> [[CMP1]]
197193
;
198194
%cmp1 = fcmp ord <2 x double> %x, zeroinitializer

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@ define float @foo1(float %a) {
1818

1919
define float @foo2(float %a) {
2020
; CHECK-LABEL: @foo2(
21-
; CHECK-NEXT: [[B:%.*]] = fcmp ogt float [[A:%.*]], 0.000000e+00
22-
; CHECK-NEXT: [[C:%.*]] = select i1 [[B]], float [[A]], float 0.000000e+00
21+
; CHECK-NEXT: [[B:%.*]] = fcmp ule float [[C:%.*]], 0.000000e+00
2322
; CHECK-NEXT: [[D:%.*]] = fcmp olt float [[C]], 1.000000e+00
24-
; CHECK-NEXT: [[E:%.*]] = select i1 [[B]], float [[A]], float 0.000000e+00
25-
; CHECK-NEXT: [[F:%.*]] = select i1 [[D]], float [[E]], float 1.000000e+00
23+
; CHECK-NEXT: [[E:%.*]] = select i1 [[D]], float [[C]], float 1.000000e+00
24+
; CHECK-NEXT: [[F:%.*]] = select i1 [[B]], float 0.000000e+00, float [[E]]
2625
; CHECK-NEXT: ret float [[F]]
2726
;
2827
%b = fcmp ogt float %a, 0.0

0 commit comments

Comments
 (0)