1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -disable-cgp | FileCheck %s 2; 3; Check that signed comparisons against 0 are eliminated if the defining 4; instruction is an add with immediate. 5; 6; Addition of an immediate does not depend on the "nsw" flag, since the 7; result can be predicted in case of overflow. For example, if adding a 8; positive immediate gives overflow, the result must be negative. 9 10; Addition of a negative immediate gives a positive result in case of 11; overflow (except for the case of the minimum value which may also result in 12; a zero result). 13define i32 @fun0(i32 %arg) { 14; CHECK-LABEL: fun0: 15; CHECK: ahik 16; CHECK-NEXT: locre 17bb: 18 %tmp = add i32 %arg, -1 19 %tmp1 = icmp eq i32 %tmp, 0 20 %res = select i1 %tmp1, i32 %tmp, i32 %arg 21 ret i32 %res 22} 23 24define i32 @fun1(i32 %arg) { 25; CHECK-LABEL: fun1: 26; CHECK: ahik 27; CHECK-NEXT: locrnle 28bb: 29 %tmp = add i32 %arg, -1 30 %tmp1 = icmp sgt i32 %tmp, 0 31 %res = select i1 %tmp1, i32 %tmp, i32 %arg 32 ret i32 %res 33} 34 35define i32 @fun2(i32 %arg) { 36; CHECK-LABEL: fun2: 37; CHECK: ahik 38; CHECK-NEXT: locrl 39bb: 40 %tmp = add i32 %arg, -1 41 %tmp1 = icmp slt i32 %tmp, 0 42 %res = select i1 %tmp1, i32 %tmp, i32 %arg 43 ret i32 %res 44} 45 46; Addition of a positive immediate gives a negative result in case of overflow. 47define i32 @fun3(i32 %arg) { 48; CHECK-LABEL: fun3: 49; CHECK: ahik 50; CHECK-NEXT: locre 51bb: 52 %tmp = add i32 %arg, 1 53 %tmp1 = icmp eq i32 %tmp, 0 54 %res = select i1 %tmp1, i32 %tmp, i32 %arg 55 ret i32 %res 56} 57 58define i32 @fun4(i32 %arg) { 59; CHECK-LABEL: fun4: 60; CHECK: ahik 61; CHECK-NEXT: locrh 62bb: 63 %tmp = add i32 %arg, 1 64 %tmp1 = icmp sgt i32 %tmp, 0 65 %res = select i1 %tmp1, i32 %tmp, i32 %arg 66 ret i32 %res 67} 68 69define i32 @fun5(i32 %arg) { 70; CHECK-LABEL: fun5: 71; CHECK: ahik 72; CHECK-NEXT: locrnhe 73bb: 74 %tmp = add i32 %arg, 1 75 %tmp1 = icmp slt i32 %tmp, 0 76 %res = select i1 %tmp1, i32 %tmp, i32 %arg 77 ret i32 %res 78} 79 80; Addition of the minimum value gives a positive or zero result. 81define i32 @fun6(i32 %arg) { 82; CHECK-LABEL: fun6: 83; CHECK: afi 84; CHECK-NEXT: chi 85; CHECK-NEXT: locre 86bb: 87 %tmp = add i32 %arg, -2147483648 88 %tmp1 = icmp eq i32 %tmp, 0 89 %res = select i1 %tmp1, i32 %tmp, i32 %arg 90 ret i32 %res 91} 92 93define i32 @fun7(i32 %arg) { 94; CHECK-LABEL: fun7: 95; CHECK: afi 96; CHECK-NEXT: chi 97; CHECK-NEXT: locrh 98bb: 99 %tmp = add i32 %arg, -2147483648 100 %tmp1 = icmp sgt i32 %tmp, 0 101 %res = select i1 %tmp1, i32 %tmp, i32 %arg 102 ret i32 %res 103} 104