diff options
| author | James Molloy <james.molloy@arm.com> | 2015-05-17 08:27:27 +0000 |
|---|---|---|
| committer | James Molloy <james.molloy@arm.com> | 2015-05-17 08:27:27 +0000 |
| commit | 53958e187a624142498f42d4a67a8e64b65b1c6c (patch) | |
| tree | a637b90f0766abb83148286e028b5d4f8aa4df55 /llvm/test/Transforms | |
| parent | 0928553eecaa835b9983c8afbc8ee3948327a06c (diff) | |
| download | bcm5719-llvm-53958e187a624142498f42d4a67a8e64b65b1c6c.tar.gz bcm5719-llvm-53958e187a624142498f42d4a67a8e64b65b1c6c.zip | |
Reapply r237520 with another fix for infinite looping
SimplifyDemandedBits was "simplifying" a constant by removing just sign bits.
This caused a canonicalization race between different parts of instcombine.
Fix and regression test added - third time lucky?
llvm-svn: 237539
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/minmax-fold.ll | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/minmax-fold.ll b/llvm/test/Transforms/InstCombine/minmax-fold.ll new file mode 100644 index 00000000000..537251109d9 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/minmax-fold.ll @@ -0,0 +1,99 @@ +; RUN: opt -S -instcombine < %s | FileCheck %s + +; CHECK-LABEL: @t1 +; CHECK-NEXT: icmp +; CHECK-NEXT: select +; CHECK-NEXT: sext +define i64 @t1(i32 %a) { + ; This is the canonical form for a type-changing min/max. + %1 = icmp slt i32 %a, 5 + %2 = select i1 %1, i32 %a, i32 5 + %3 = sext i32 %2 to i64 + ret i64 %3 +} + +; CHECK-LABEL: @t2 +; CHECK-NEXT: icmp +; CHECK-NEXT: select +; CHECK-NEXT: sext +define i64 @t2(i32 %a) { + ; Check this is converted into canonical form, as above. + %1 = icmp slt i32 %a, 5 + %2 = sext i32 %a to i64 + %3 = select i1 %1, i64 %2, i64 5 + ret i64 %3 +} + +; CHECK-LABEL: @t3 +; CHECK-NEXT: icmp +; CHECK-NEXT: select +; CHECK-NEXT: zext +define i64 @t3(i32 %a) { + ; Same as @t2, with flipped operands and zext instead of sext. + %1 = icmp ult i32 %a, 5 + %2 = zext i32 %a to i64 + %3 = select i1 %1, i64 5, i64 %2 + ret i64 %3 +} + +; CHECK-LABEL: @t4 +; CHECK-NEXT: icmp +; CHECK-NEXT: select +; CHECK-NEXT: trunc +define i32 @t4(i64 %a) { + ; Same again, with trunc. + %1 = icmp slt i64 %a, 5 + %2 = trunc i64 %a to i32 + %3 = select i1 %1, i32 %2, i32 5 + ret i32 %3 +} + +; CHECK-LABEL: @t5 +; CHECK-NEXT: icmp +; CHECK-NEXT: zext +; CHECK-NEXT: select +define i64 @t5(i32 %a) { + ; Same as @t3, but with mismatched signedness between icmp and zext. + ; InstCombine should leave this alone. + %1 = icmp slt i32 %a, 5 + %2 = zext i32 %a to i64 + %3 = select i1 %1, i64 5, i64 %2 + ret i64 %3 +} + +; CHECK-LABEL: @t6 +; CHECK-NEXT: icmp +; CHECK-NEXT: select +; CHECK-NEXT: sitofp +define float @t6(i32 %a) { + %1 = icmp slt i32 %a, 0 + %2 = select i1 %1, i32 %a, i32 0 + %3 = sitofp i32 %2 to float + ret float %3 +} + +; CHECK-LABEL: @t7 +; CHECK-NEXT: icmp +; CHECK-NEXT: select +; CHECK-NEXT: trunc +define i16 @t7(i32 %a) { + %1 = icmp slt i32 %a, -32768 + %2 = trunc i32 %a to i16 + %3 = select i1 %1, i16 %2, i16 -32768 + ret i16 %3 +} + +; Just check for no infinite loop. InstSimplify liked to +; "simplify" -32767 by removing all the sign bits, +; which led to a canonicalization fight between different +; parts of instcombine. +define i32 @t8(i64 %a, i32 %b) { + %1 = icmp slt i64 %a, -32767 + %2 = select i1 %1, i64 %a, i64 -32767 + %3 = trunc i64 %2 to i32 + %4 = icmp slt i32 %b, 42 + %5 = select i1 %4, i32 42, i32 %3 + %6 = icmp ne i32 %5, %b + %7 = zext i1 %6 to i32 + ret i32 %7 +} |

