diff options
author | Shuxin Yang <shuxin.llvm@gmail.com> | 2012-12-14 18:46:06 +0000 |
---|---|---|
committer | Shuxin Yang <shuxin.llvm@gmail.com> | 2012-12-14 18:46:06 +0000 |
commit | a5ed031fbcec67081d4857c9000f0180840fe2d5 (patch) | |
tree | eff24d6c36ed4dfe55e3e0bf2b36acf14b78db42 /test/Transforms | |
parent | 63cab6c9d2f8c54f599c4b2ec6b2530ca3b585e1 (diff) | |
download | llvm-a5ed031fbcec67081d4857c9000f0180840fe2d5.tar.gz llvm-a5ed031fbcec67081d4857c9000f0180840fe2d5.tar.bz2 llvm-a5ed031fbcec67081d4857c9000f0180840fe2d5.tar.xz |
rdar://12753946
Implement rule : "x * (select cond 1.0, 0.0) -> select cond x, 0.0"
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170226 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms')
-rw-r--r-- | test/Transforms/InstCombine/fast-math.ll | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/test/Transforms/InstCombine/fast-math.ll b/test/Transforms/InstCombine/fast-math.ll index b6a15677bb..0b87cd95d9 100644 --- a/test/Transforms/InstCombine/fast-math.ll +++ b/test/Transforms/InstCombine/fast-math.ll @@ -3,19 +3,17 @@ ; testing-case "float fold(float a) { return 1.2f * a * 2.3f; }" ; 1.2f and 2.3f is supposed to be fold. define float @fold(float %a) { -fold: %mul = fmul fast float %a, 0x3FF3333340000000 %mul1 = fmul fast float %mul, 0x4002666660000000 ret float %mul1 -; CHECK: fold +; CHECK: @fold ; CHECK: fmul float %a, 0x4006147AE0000000 } ; Same testing-case as the one used in fold() except that the operators have ; fixed FP mode. define float @notfold(float %a) { -notfold: -; CHECK: notfold +; CHECK: @notfold ; CHECK: %mul = fmul fast float %a, 0x3FF3333340000000 %mul = fmul fast float %a, 0x3FF3333340000000 %mul1 = fmul float %mul, 0x4002666660000000 @@ -23,10 +21,40 @@ notfold: } define float @fold2(float %a) { -fold2: -; CHECK: fold2 +; CHECK: @fold2 ; CHECK: fmul float %a, 0x4006147AE0000000 %mul = fmul float %a, 0x3FF3333340000000 %mul1 = fmul fast float %mul, 0x4002666660000000 ret float %mul1 } + +; rdar://12753946: x * cond ? 1.0 : 0.0 => cond ? x : 0.0 +define double @select1(i32 %cond, double %x, double %y) { + %tobool = icmp ne i32 %cond, 0 + %cond1 = select i1 %tobool, double 1.000000e+00, double 0.000000e+00 + %mul = fmul nnan nsz double %cond1, %x + %add = fadd double %mul, %y + ret double %add +; CHECK: @select1 +; CHECK: select i1 %tobool, double %x, double 0.000000e+00 +} + +define double @select2(i32 %cond, double %x, double %y) { + %tobool = icmp ne i32 %cond, 0 + %cond1 = select i1 %tobool, double 0.000000e+00, double 1.000000e+00 + %mul = fmul nnan nsz double %cond1, %x + %add = fadd double %mul, %y + ret double %add +; CHECK: @select2 +; CHECK: select i1 %tobool, double 0.000000e+00, double %x +} + +define double @select3(i32 %cond, double %x, double %y) { + %tobool = icmp ne i32 %cond, 0 + %cond1 = select i1 %tobool, double 0.000000e+00, double 2.000000e+00 + %mul = fmul nnan nsz double %cond1, %x + %add = fadd double %mul, %y + ret double %add +; CHECK: @select3 +; CHECK: fmul nnan nsz double %cond1, %x +} |