Skip to content

Commit 90629b9

Browse files
committed
[ValueTracking] Add more tests.
1 parent e1fa250 commit 90629b9

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

llvm/lib/Analysis/DomConditionCache.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ static void findAffectedValues(Value *Cond,
7070
}
7171
}
7272
// Handle patterns that computeKnownFPClass() support.
73+
FCmpInst::Predicate Pred;
74+
Value *A;
7375
if (match(Cond, m_FCmp(Pred, m_Value(A), m_Constant())))
7476
AddAffected(A);
7577
if (match(Cond, m_Intrinsic<Intrinsic::is_fpclass>(m_Value(A), m_Constant())))

llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,70 @@ if.else:
177177
ret i1 %ret2
178178
}
179179

180+
; TODO: These two is.fpclass can be simplified.
181+
define i1 @test8(float %x) {
182+
; CHECK-LABEL: define i1 @test8(
183+
; CHECK-SAME: float [[X:%.*]]) {
184+
; CHECK-NEXT: [[ABS:%.*]] = call float @llvm.fabs.f32(float [[X]])
185+
; CHECK-NEXT: [[COND:%.*]] = fcmp oeq float [[ABS]], 0x7FF0000000000000
186+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
187+
; CHECK: if.then:
188+
; CHECK-NEXT: [[RET1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 575)
189+
; CHECK-NEXT: ret i1 [[RET1]]
190+
; CHECK: if.else:
191+
; CHECK-NEXT: [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 575)
192+
; CHECK-NEXT: ret i1 [[RET2]]
193+
;
194+
%abs = call float @llvm.fabs.f32(float %x)
195+
%cond = fcmp oeq float %abs, 0x7FF0000000000000
196+
br i1 %cond, label %if.then, label %if.else
197+
if.then:
198+
%ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 575)
199+
ret i1 %ret1
200+
if.else:
201+
%ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 575)
202+
ret i1 %ret2
203+
}
204+
205+
define i1 @test9(float %x) {
206+
; CHECK-LABEL: define i1 @test9(
207+
; CHECK-SAME: float [[X:%.*]]) {
208+
; CHECK-NEXT: [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00
209+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
210+
; CHECK: if.then:
211+
; CHECK-NEXT: ret i1 false
212+
; CHECK: if.else:
213+
; CHECK-NEXT: ret i1 false
214+
;
215+
%cond = fcmp olt float %x, -1.0
216+
br i1 %cond, label %if.then, label %if.else
217+
if.then:
218+
%ret1 = fcmp oeq float %x, 0x7FF0000000000000
219+
ret i1 %ret1
220+
if.else:
221+
ret i1 false
222+
}
223+
224+
define i1 @test10(float %x) {
225+
; CHECK-LABEL: define i1 @test10(
226+
; CHECK-SAME: float [[X:%.*]]) {
227+
; CHECK-NEXT: [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00
228+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
229+
; CHECK: if.then:
230+
; CHECK-NEXT: ret i1 false
231+
; CHECK: if.else:
232+
; CHECK-NEXT: ret i1 false
233+
;
234+
%cond = fcmp olt float %x, -1.0
235+
%neg = fneg float %x
236+
br i1 %cond, label %if.then, label %if.else
237+
if.then:
238+
%ret1 = fcmp oeq float %neg, 0xFFF0000000000000
239+
ret i1 %ret1
240+
if.else:
241+
ret i1 false
242+
}
243+
180244
define i1 @test1_no_dominating(float %x, i1 %c) {
181245
; CHECK-LABEL: define i1 @test1_no_dominating(
182246
; CHECK-SAME: float [[X:%.*]], i1 [[C:%.*]]) {

0 commit comments

Comments
 (0)