; 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 }