Skip to content

Commit 1a4fa35

Browse files
committed
CR
1 parent 34a8e5b commit 1a4fa35

File tree

2 files changed

+94
-28
lines changed

2 files changed

+94
-28
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8184,64 +8184,64 @@ static Instruction *foldFCmpWithFloorAndCeil(FCmpInst &I,
81848184
Type *OpType = LHS->getType();
81858185
CmpInst::Predicate Pred = I.getPredicate();
81868186

8187-
bool floor_x = match(LHS, m_Intrinsic<Intrinsic::floor>(m_Specific(RHS)));
8188-
bool x_floor = match(RHS, m_Intrinsic<Intrinsic::floor>(m_Specific(LHS)));
8189-
bool ceil_x = match(LHS, m_Intrinsic<Intrinsic::ceil>(m_Specific(RHS)));
8190-
bool x_ceil = match(RHS, m_Intrinsic<Intrinsic::ceil>(m_Specific(LHS)));
8187+
bool FloorX = match(LHS, m_Intrinsic<Intrinsic::floor>(m_Specific(RHS)));
8188+
bool CeilX = match(LHS, m_Intrinsic<Intrinsic::ceil>(m_Specific(RHS)));
81918189

8192-
if (x_floor || x_ceil) {
8193-
std::swap(LHS, RHS);
8194-
Pred = I.getSwappedPredicate();
8195-
(x_floor ? floor_x : ceil_x) = true;
8190+
if (!FloorX && !CeilX) {
8191+
if ((FloorX = match(RHS, m_Intrinsic<Intrinsic::floor>(m_Specific(LHS)))) ||
8192+
(CeilX = match(RHS, m_Intrinsic<Intrinsic::ceil>(m_Specific(LHS))))) {
8193+
std::swap(LHS, RHS);
8194+
Pred = I.getSwappedPredicate();
8195+
}
81968196
}
81978197

81988198
switch (Pred) {
81998199
case FCmpInst::FCMP_OLE:
82008200
// fcmp ole floor(x), x => fcmp ord x, 0
8201-
if (floor_x)
8201+
if (FloorX)
82028202
return new FCmpInst(FCmpInst::FCMP_ORD, RHS, ConstantFP::getZero(OpType),
82038203
"", &I);
82048204
break;
82058205
case FCmpInst::FCMP_OGT:
82068206
// fcmp ogt floor(x), x => false
8207-
if (floor_x)
8207+
if (FloorX)
82088208
return CI.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
82098209
break;
82108210
case FCmpInst::FCMP_OGE:
82118211
// fcmp oge ceil(x), x => fcmp ord x, 0
8212-
if (ceil_x)
8212+
if (CeilX)
82138213
return new FCmpInst(FCmpInst::FCMP_ORD, RHS, ConstantFP::getZero(OpType),
82148214
"", &I);
82158215
break;
82168216
case FCmpInst::FCMP_OLT:
82178217
// fcmp olt ceil(x), x => false
8218-
if (ceil_x)
8218+
if (CeilX)
82198219
return CI.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
82208220
break;
82218221
case FCmpInst::FCMP_ULE:
82228222
// fcmp ule floor(x), x => fcmp ule -inf, x
8223-
if (floor_x)
8223+
if (FloorX)
82248224
return new FCmpInst(FCmpInst::FCMP_ULE,
82258225
ConstantFP::getInfinity(RHS->getType(), true), RHS,
82268226
"", &I);
82278227
break;
82288228
case FCmpInst::FCMP_UGT:
82298229
// fcmp ugt floor(x), x => fcmp ugt -inf, x
8230-
if (floor_x)
8230+
if (FloorX)
82318231
return new FCmpInst(FCmpInst::FCMP_UGT,
82328232
ConstantFP::getInfinity(RHS->getType(), true), RHS,
82338233
"", &I);
82348234
break;
82358235
case FCmpInst::FCMP_UGE:
82368236
// fcmp uge ceil(x), x => fcmp uge inf, x
8237-
if (ceil_x)
8237+
if (CeilX)
82388238
return new FCmpInst(FCmpInst::FCMP_UGE,
82398239
ConstantFP::getInfinity(RHS->getType(), false), RHS,
82408240
"", &I);
82418241
break;
82428242
case FCmpInst::FCMP_ULT:
82438243
// fcmp ult ceil(x), x => fcmp ult inf, x
8244-
if (ceil_x)
8244+
if (CeilX)
82458245
return new FCmpInst(FCmpInst::FCMP_ULT,
82468246
ConstantFP::getInfinity(RHS->getType(), false), RHS,
82478247
"", &I);

llvm/test/Transforms/InstCombine/fp-floor-ceil.ll

Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,21 @@ define i1 @floor_x_ogt(float %x) {
3131

3232
define i1 @floor_x_ugt(float %x) {
3333
; CHECK-LABEL: @floor_x_ugt(
34-
; CHECK-NEXT: [[RET:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
34+
; CHECK-NEXT: [[RET:%.*]] = fcmp ninf uno float [[X:%.*]], 0.000000e+00
3535
; CHECK-NEXT: ret i1 [[RET]]
3636
;
3737
%floor = call float @llvm.floor.f32(float %x)
38-
%ret = fcmp ugt float %floor, %x
38+
%ret = fcmp ninf ugt float %floor, %x
3939
ret i1 %ret
4040
}
4141

4242
define i1 @x_floor_oge(float %x) {
4343
; CHECK-LABEL: @x_floor_oge(
44-
; CHECK-NEXT: [[RET:%.*]] = fcmp ord float [[X:%.*]], 0.000000e+00
44+
; CHECK-NEXT: [[RET:%.*]] = fcmp ninf ord float [[X:%.*]], 0.000000e+00
4545
; CHECK-NEXT: ret i1 [[RET]]
4646
;
4747
%floor = call float @llvm.floor.f32(float %x)
48-
%ret = fcmp oge float %x, %floor
48+
%ret = fcmp ninf oge float %x, %floor
4949
ret i1 %ret
5050
}
5151

@@ -69,11 +69,11 @@ define i1 @x_floor_olt(float %x) {
6969

7070
define i1 @x_floor_ult(float %x) {
7171
; CHECK-LABEL: @x_floor_ult(
72-
; CHECK-NEXT: [[RET:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
72+
; CHECK-NEXT: [[RET:%.*]] = fcmp ninf uno float [[X:%.*]], 0.000000e+00
7373
; CHECK-NEXT: ret i1 [[RET]]
7474
;
7575
%floor = call float @llvm.floor.f32(float %x)
76-
%ret = fcmp ult float %x, %floor
76+
%ret = fcmp ninf ult float %x, %floor
7777
ret i1 %ret
7878
}
7979

@@ -97,6 +97,39 @@ define i1 @x_floor_ole_neg(float %x) {
9797
ret i1 %ret
9898
}
9999

100+
define i1 @x_floor_ogt_neg(float %x) {
101+
; CHECK-LABEL: @x_floor_ogt_neg(
102+
; CHECK-NEXT: [[FLOOR:%.*]] = call float @llvm.floor.f32(float [[X:%.*]])
103+
; CHECK-NEXT: [[RET:%.*]] = fcmp ogt float [[X]], [[FLOOR]]
104+
; CHECK-NEXT: ret i1 [[RET]]
105+
;
106+
%floor = call float @llvm.floor.f32(float %x)
107+
%ret = fcmp ogt float %x, %floor
108+
ret i1 %ret
109+
}
110+
111+
define i1 @x_floor_ueq_neg(float %x) {
112+
; CHECK-LABEL: @x_floor_ueq_neg(
113+
; CHECK-NEXT: [[FLOOR:%.*]] = call float @llvm.floor.f32(float [[X:%.*]])
114+
; CHECK-NEXT: [[RET:%.*]] = fcmp ueq float [[X]], [[FLOOR]]
115+
; CHECK-NEXT: ret i1 [[RET]]
116+
;
117+
%floor = call float @llvm.floor.f32(float %x)
118+
%ret = fcmp ueq float %x, %floor
119+
ret i1 %ret
120+
}
121+
122+
define i1 @x_floor_une_neg(float %x) {
123+
; CHECK-LABEL: @x_floor_une_neg(
124+
; CHECK-NEXT: [[FLOOR:%.*]] = call float @llvm.floor.f32(float [[X:%.*]])
125+
; CHECK-NEXT: [[RET:%.*]] = fcmp une float [[X]], [[FLOOR]]
126+
; CHECK-NEXT: ret i1 [[RET]]
127+
;
128+
%floor = call float @llvm.floor.f32(float %x)
129+
%ret = fcmp une float %x, %floor
130+
ret i1 %ret
131+
}
132+
100133
define i1 @ceil_x_oge(float %x) {
101134
; CHECK-LABEL: @ceil_x_oge(
102135
; CHECK-NEXT: [[RET:%.*]] = fcmp ninf ord float [[X:%.*]], 0.000000e+00
@@ -127,21 +160,21 @@ define i1 @ceil_x_olt(float %x) {
127160

128161
define i1 @ceil_x_ult(float %x) {
129162
; CHECK-LABEL: @ceil_x_ult(
130-
; CHECK-NEXT: [[RET:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
163+
; CHECK-NEXT: [[RET:%.*]] = fcmp ninf uno float [[X:%.*]], 0.000000e+00
131164
; CHECK-NEXT: ret i1 [[RET]]
132165
;
133166
%ceil = call float @llvm.ceil.f32(float %x)
134-
%ret = fcmp ult float %ceil, %x
167+
%ret = fcmp ninf ult float %ceil, %x
135168
ret i1 %ret
136169
}
137170

138171
define i1 @x_ceil_ole(float %x) {
139172
; CHECK-LABEL: @x_ceil_ole(
140-
; CHECK-NEXT: [[RET:%.*]] = fcmp ord float [[X:%.*]], 0.000000e+00
173+
; CHECK-NEXT: [[RET:%.*]] = fcmp ninf ord float [[X:%.*]], 0.000000e+00
141174
; CHECK-NEXT: ret i1 [[RET]]
142175
;
143176
%ceil = call float @llvm.ceil.f32(float %x)
144-
%ret = fcmp ole float %x, %ceil
177+
%ret = fcmp ninf ole float %x, %ceil
145178
ret i1 %ret
146179
}
147180

@@ -165,11 +198,11 @@ define i1 @x_ceil_ogt(float %x) {
165198

166199
define i1 @x_ceil_ugt(float %x) {
167200
; CHECK-LABEL: @x_ceil_ugt(
168-
; CHECK-NEXT: [[RET:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
201+
; CHECK-NEXT: [[RET:%.*]] = fcmp ninf uno float [[X:%.*]], 0.000000e+00
169202
; CHECK-NEXT: ret i1 [[RET]]
170203
;
171204
%ceil = call float @llvm.ceil.f32(float %x)
172-
%ret = fcmp ugt float %x, %ceil
205+
%ret = fcmp ninf ugt float %x, %ceil
173206
ret i1 %ret
174207
}
175208

@@ -192,3 +225,36 @@ define i1 @x_ceil_oge_neg(float %x) {
192225
%ret = fcmp oge float %x, %ceil
193226
ret i1 %ret
194227
}
228+
229+
define i1 @x_ceil_olt_neg(float %x) {
230+
; CHECK-LABEL: @x_ceil_olt_neg(
231+
; CHECK-NEXT: [[CEIL:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]])
232+
; CHECK-NEXT: [[RET:%.*]] = fcmp olt float [[X]], [[CEIL]]
233+
; CHECK-NEXT: ret i1 [[RET]]
234+
;
235+
%ceil = call float @llvm.ceil.f32(float %x)
236+
%ret = fcmp olt float %x, %ceil
237+
ret i1 %ret
238+
}
239+
240+
define i1 @x_ceil_oeq_neg(float %x) {
241+
; CHECK-LABEL: @x_ceil_oeq_neg(
242+
; CHECK-NEXT: [[CEIL:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]])
243+
; CHECK-NEXT: [[RET:%.*]] = fcmp oeq float [[X]], [[CEIL]]
244+
; CHECK-NEXT: ret i1 [[RET]]
245+
;
246+
%ceil = call float @llvm.ceil.f32(float %x)
247+
%ret = fcmp oeq float %x, %ceil
248+
ret i1 %ret
249+
}
250+
251+
define i1 @x_ceil_one_neg(float %x) {
252+
; CHECK-LABEL: @x_ceil_one_neg(
253+
; CHECK-NEXT: [[CEIL:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]])
254+
; CHECK-NEXT: [[RET:%.*]] = fcmp one float [[X]], [[CEIL]]
255+
; CHECK-NEXT: ret i1 [[RET]]
256+
;
257+
%ceil = call float @llvm.ceil.f32(float %x)
258+
%ret = fcmp one float %x, %ceil
259+
ret i1 %ret
260+
}

0 commit comments

Comments
 (0)