blob: 7c67ffb4be0db00438d9fc257fa811f041fa434d [file] [log] [blame]
Sanjay Patel69632442016-03-25 20:12:25 +00001; NOTE: Assertions have been autogenerated by update_test_checks.py
Elena Demikhovsky45f04482015-01-28 08:03:58 +00002; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4; These tests choose arbitrarily between float and double,
Sanjay Patel69632442016-03-25 20:12:25 +00005; and between uge and olt, to give reasonble coverage
Elena Demikhovsky45f04482015-01-28 08:03:58 +00006; without combinatorial explosion.
7
8declare float @llvm.fabs.f32(float)
9declare float @llvm.sqrt.f32(float)
10declare double @llvm.powi.f64(double,i32)
11declare float @llvm.exp.f32(float)
Fiona Glaserdb7824f2016-01-12 23:37:30 +000012declare float @llvm.minnum.f32(float, float)
13declare float @llvm.maxnum.f32(float, float)
Elena Demikhovsky45f04482015-01-28 08:03:58 +000014declare double @llvm.exp2.f64(double)
15declare float @llvm.fma.f32(float,float,float)
16
17declare void @expect_equal(i1,i1)
18
Elena Demikhovsky45f04482015-01-28 08:03:58 +000019define i1 @orderedLessZeroTree(float,float,float,float) {
Sanjay Patel69632442016-03-25 20:12:25 +000020; CHECK-LABEL: @orderedLessZeroTree(
21; CHECK: ret i1 true
22;
Elena Demikhovsky45f04482015-01-28 08:03:58 +000023 %square = fmul float %0, %0
24 %abs = call float @llvm.fabs.f32(float %1)
25 %sqrt = call float @llvm.sqrt.f32(float %2)
26 %fma = call float @llvm.fma.f32(float %3, float %3, float %sqrt)
27 %div = fdiv float %square, %abs
28 %rem = frem float %sqrt, %fma
29 %add = fadd float %div, %rem
30 %uge = fcmp uge float %add, 0.000000e+00
Elena Demikhovsky45f04482015-01-28 08:03:58 +000031 ret i1 %uge
32}
33
Elena Demikhovsky45f04482015-01-28 08:03:58 +000034define i1 @orderedLessZeroExpExt(float) {
Sanjay Patel69632442016-03-25 20:12:25 +000035; CHECK-LABEL: @orderedLessZeroExpExt(
36; CHECK: ret i1 true
37;
Elena Demikhovsky45f04482015-01-28 08:03:58 +000038 %a = call float @llvm.exp.f32(float %0)
39 %b = fpext float %a to double
40 %uge = fcmp uge double %b, 0.000000e+00
Elena Demikhovsky45f04482015-01-28 08:03:58 +000041 ret i1 %uge
42}
43
Elena Demikhovsky45f04482015-01-28 08:03:58 +000044define i1 @orderedLessZeroExp2Trunc(double) {
Sanjay Patel69632442016-03-25 20:12:25 +000045; CHECK-LABEL: @orderedLessZeroExp2Trunc(
46; CHECK: ret i1 false
47;
Elena Demikhovsky45f04482015-01-28 08:03:58 +000048 %a = call double @llvm.exp2.f64(double %0)
49 %b = fptrunc double %a to float
50 %olt = fcmp olt float %b, 0.000000e+00
Elena Demikhovsky45f04482015-01-28 08:03:58 +000051 ret i1 %olt
52}
53
Elena Demikhovsky45f04482015-01-28 08:03:58 +000054define i1 @orderedLessZeroPowi(double,double) {
Sanjay Patel69632442016-03-25 20:12:25 +000055; CHECK-LABEL: @orderedLessZeroPowi(
56; CHECK: ret i1 false
57;
Elena Demikhovsky45f04482015-01-28 08:03:58 +000058 ; Even constant exponent
59 %a = call double @llvm.powi.f64(double %0, i32 2)
60 %square = fmul double %1, %1
61 ; Odd constant exponent with provably non-negative base
62 %b = call double @llvm.powi.f64(double %square, i32 3)
63 %c = fadd double %a, %b
64 %olt = fcmp olt double %b, 0.000000e+00
Elena Demikhovsky45f04482015-01-28 08:03:58 +000065 ret i1 %olt
66}
67
Fiona Glaserdb7824f2016-01-12 23:37:30 +000068define i1 @orderedLessZeroUIToFP(i32) {
Sanjay Patel69632442016-03-25 20:12:25 +000069; CHECK-LABEL: @orderedLessZeroUIToFP(
70; CHECK: ret i1 true
71;
Fiona Glaserdb7824f2016-01-12 23:37:30 +000072 %a = uitofp i32 %0 to float
73 %uge = fcmp uge float %a, 0.000000e+00
Fiona Glaserdb7824f2016-01-12 23:37:30 +000074 ret i1 %uge
75}
76
Fiona Glaserdb7824f2016-01-12 23:37:30 +000077define i1 @orderedLessZeroSelect(float, float) {
Sanjay Patel69632442016-03-25 20:12:25 +000078; CHECK-LABEL: @orderedLessZeroSelect(
79; CHECK: ret i1 true
80;
Fiona Glaserdb7824f2016-01-12 23:37:30 +000081 %a = call float @llvm.exp.f32(float %0)
82 %b = call float @llvm.fabs.f32(float %1)
83 %c = fcmp olt float %0, %1
84 %d = select i1 %c, float %a, float %b
85 %e = fadd float %d, 1.0
86 %uge = fcmp uge float %e, 0.000000e+00
Fiona Glaserdb7824f2016-01-12 23:37:30 +000087 ret i1 %uge
88}
89
Fiona Glaserdb7824f2016-01-12 23:37:30 +000090define i1 @orderedLessZeroMinNum(float, float) {
Sanjay Patel69632442016-03-25 20:12:25 +000091; CHECK-LABEL: @orderedLessZeroMinNum(
92; CHECK: ret i1 true
93;
Fiona Glaserdb7824f2016-01-12 23:37:30 +000094 %a = call float @llvm.exp.f32(float %0)
95 %b = call float @llvm.fabs.f32(float %1)
96 %c = call float @llvm.minnum.f32(float %a, float %b)
97 %uge = fcmp uge float %c, 0.000000e+00
Fiona Glaserdb7824f2016-01-12 23:37:30 +000098 ret i1 %uge
99}
100
Fiona Glaserdb7824f2016-01-12 23:37:30 +0000101define i1 @orderedLessZeroMaxNum(float, float) {
Sanjay Patel69632442016-03-25 20:12:25 +0000102; CHECK-LABEL: @orderedLessZeroMaxNum(
103; CHECK: ret i1 true
104;
Fiona Glaserdb7824f2016-01-12 23:37:30 +0000105 %a = call float @llvm.exp.f32(float %0)
106 %b = call float @llvm.maxnum.f32(float %a, float %1)
107 %uge = fcmp uge float %b, 0.000000e+00
Fiona Glaserdb7824f2016-01-12 23:37:30 +0000108 ret i1 %uge
109}
110
Benjamin Kramerf4ebfa32015-07-10 14:02:02 +0000111define i1 @nonans1(double %in1, double %in2) {
Sanjay Patel69632442016-03-25 20:12:25 +0000112; CHECK-LABEL: @nonans1(
113; CHECK: ret i1 false
114;
Benjamin Kramerf4ebfa32015-07-10 14:02:02 +0000115 %cmp = fcmp nnan uno double %in1, %in2
116 ret i1 %cmp
Benjamin Kramerf4ebfa32015-07-10 14:02:02 +0000117}
118
119define i1 @nonans2(double %in1, double %in2) {
Sanjay Patel69632442016-03-25 20:12:25 +0000120; CHECK-LABEL: @nonans2(
121; CHECK: ret i1 true
122;
Benjamin Kramerf4ebfa32015-07-10 14:02:02 +0000123 %cmp = fcmp nnan ord double %in1, %in2
124 ret i1 %cmp
Benjamin Kramerf4ebfa32015-07-10 14:02:02 +0000125}