1; RUN: opt < %s -instsimplify -S | FileCheck %s 2 3; These tests choose arbitrarily between float and double, 4; and between uge and olt, to give reasonble coverage 5; without combinatorial explosion. 6 7declare float @llvm.fabs.f32(float) 8declare float @llvm.sqrt.f32(float) 9declare double @llvm.powi.f64(double,i32) 10declare float @llvm.exp.f32(float) 11declare double @llvm.exp2.f64(double) 12declare float @llvm.fma.f32(float,float,float) 13 14declare void @expect_equal(i1,i1) 15 16; CHECK-LABEL: @orderedLessZeroTree( 17define i1 @orderedLessZeroTree(float,float,float,float) { 18 %square = fmul float %0, %0 19 %abs = call float @llvm.fabs.f32(float %1) 20 %sqrt = call float @llvm.sqrt.f32(float %2) 21 %fma = call float @llvm.fma.f32(float %3, float %3, float %sqrt) 22 %div = fdiv float %square, %abs 23 %rem = frem float %sqrt, %fma 24 %add = fadd float %div, %rem 25 %uge = fcmp uge float %add, 0.000000e+00 26; CHECK: ret i1 true 27 ret i1 %uge 28} 29 30; CHECK-LABEL: @orderedLessZeroExpExt( 31define i1 @orderedLessZeroExpExt(float) { 32 %a = call float @llvm.exp.f32(float %0) 33 %b = fpext float %a to double 34 %uge = fcmp uge double %b, 0.000000e+00 35; CHECK: ret i1 true 36 ret i1 %uge 37} 38 39; CHECK-LABEL: @orderedLessZeroExp2Trunc( 40define i1 @orderedLessZeroExp2Trunc(double) { 41 %a = call double @llvm.exp2.f64(double %0) 42 %b = fptrunc double %a to float 43 %olt = fcmp olt float %b, 0.000000e+00 44; CHECK: ret i1 false 45 ret i1 %olt 46} 47 48; CHECK-LABEL: @orderedLessZeroPowi( 49define i1 @orderedLessZeroPowi(double,double) { 50 ; Even constant exponent 51 %a = call double @llvm.powi.f64(double %0, i32 2) 52 %square = fmul double %1, %1 53 ; Odd constant exponent with provably non-negative base 54 %b = call double @llvm.powi.f64(double %square, i32 3) 55 %c = fadd double %a, %b 56 %olt = fcmp olt double %b, 0.000000e+00 57; CHECK: ret i1 false 58 ret i1 %olt 59} 60 61define i1 @nonans1(double %in1, double %in2) { 62 %cmp = fcmp nnan uno double %in1, %in2 63 ret i1 %cmp 64 65; CHECK-LABEL: @nonans1 66; CHECK-NEXT: ret i1 false 67} 68 69define i1 @nonans2(double %in1, double %in2) { 70 %cmp = fcmp nnan ord double %in1, %in2 71 ret i1 %cmp 72 73; CHECK-LABEL: @nonans2 74; CHECK-NEXT: ret i1 true 75} 76