diff options
Diffstat (limited to 'llvm/test/CodeGen/SystemZ/int-cmp-57.ll')
| -rw-r--r-- | llvm/test/CodeGen/SystemZ/int-cmp-57.ll | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/SystemZ/int-cmp-57.ll b/llvm/test/CodeGen/SystemZ/int-cmp-57.ll new file mode 100644 index 00000000000..a49edc19655 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/int-cmp-57.ll @@ -0,0 +1,103 @@ +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -disable-cgp | FileCheck %s +; +; Check that signed comparisons against 0 are eliminated if the defining +; instruction is an add with immediate. +; +; Addition of an immediate does not depend on the "nsw" flag, since the +; result can be predicted in case of overflow. For example, if adding a +; positive immediate gives overflow, the result must be negative. + +; Addition of a negative immediate gives a positive result in case of +; overflow (except for the case of the minimum value which may also result in +; a zero result). +define i32 @fun0(i32 %arg) { +; CHECK-LABEL: fun0: +; CHECK: ahik +; CHECK-NEXT: locre +bb: + %tmp = add i32 %arg, -1 + %tmp1 = icmp eq i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun1(i32 %arg) { +; CHECK-LABEL: fun1: +; CHECK: ahik +; CHECK-NEXT: locrnle +bb: + %tmp = add i32 %arg, -1 + %tmp1 = icmp sgt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun2(i32 %arg) { +; CHECK-LABEL: fun2: +; CHECK: ahik +; CHECK-NEXT: locrl +bb: + %tmp = add i32 %arg, -1 + %tmp1 = icmp slt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +; Addition of a positive immediate gives a negative result in case of overflow. +define i32 @fun3(i32 %arg) { +; CHECK-LABEL: fun3: +; CHECK: ahik +; CHECK-NEXT: locre +bb: + %tmp = add i32 %arg, 1 + %tmp1 = icmp eq i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun4(i32 %arg) { +; CHECK-LABEL: fun4: +; CHECK: ahik +; CHECK-NEXT: locrh +bb: + %tmp = add i32 %arg, 1 + %tmp1 = icmp sgt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun5(i32 %arg) { +; CHECK-LABEL: fun5: +; CHECK: ahik +; CHECK-NEXT: locrnhe +bb: + %tmp = add i32 %arg, 1 + %tmp1 = icmp slt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +; Addition of the minimum value gives a positive or zero result. +define i32 @fun6(i32 %arg) { +; CHECK-LABEL: fun6: +; CHECK: afi +; CHECK-NEXT: chi +; CHECK-NEXT: locrlh +bb: + %tmp = add i32 %arg, -2147483648 + %tmp1 = icmp eq i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun7(i32 %arg) { +; CHECK-LABEL: fun7: +; CHECK: afi +; CHECK-NEXT: chi +; CHECK-NEXT: locrle +bb: + %tmp = add i32 %arg, -2147483648 + %tmp1 = icmp sgt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} |

