summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/SystemZ/int-cmp-57.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/SystemZ/int-cmp-57.ll')
-rw-r--r--llvm/test/CodeGen/SystemZ/int-cmp-57.ll103
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
+}
OpenPOWER on IntegriCloud