104 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -disable-cgp | FileCheck %s2;3; Check that signed comparisons against 0 are eliminated if the defining4; instruction is an add with immediate.5;6; Addition of an immediate does not depend on the "nsw" flag, since the7; result can be predicted in case of overflow. For example, if adding a8; positive immediate gives overflow, the result must be negative.9 10; Addition of a negative immediate gives a positive result in case of11; overflow (except for the case of the minimum value which may also result in12; a zero result).13define i32 @fun0(i32 %arg) {14; CHECK-LABEL: fun0:15; CHECK: ahik16; CHECK-NEXT: locre17bb:18 %tmp = add i32 %arg, -119 %tmp1 = icmp eq i32 %tmp, 020 %res = select i1 %tmp1, i32 %tmp, i32 %arg21 ret i32 %res22}23 24define i32 @fun1(i32 %arg) {25; CHECK-LABEL: fun1:26; CHECK: ahik27; CHECK-NEXT: locrnle28bb:29 %tmp = add i32 %arg, -130 %tmp1 = icmp sgt i32 %tmp, 031 %res = select i1 %tmp1, i32 %tmp, i32 %arg32 ret i32 %res33}34 35define i32 @fun2(i32 %arg) {36; CHECK-LABEL: fun2:37; CHECK: ahik38; CHECK-NEXT: locrl39bb:40 %tmp = add i32 %arg, -141 %tmp1 = icmp slt i32 %tmp, 042 %res = select i1 %tmp1, i32 %tmp, i32 %arg43 ret i32 %res44}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: ahik50; CHECK-NEXT: locre51bb:52 %tmp = add i32 %arg, 153 %tmp1 = icmp eq i32 %tmp, 054 %res = select i1 %tmp1, i32 %tmp, i32 %arg55 ret i32 %res56}57 58define i32 @fun4(i32 %arg) {59; CHECK-LABEL: fun4:60; CHECK: ahik61; CHECK-NEXT: locrh62bb:63 %tmp = add i32 %arg, 164 %tmp1 = icmp sgt i32 %tmp, 065 %res = select i1 %tmp1, i32 %tmp, i32 %arg66 ret i32 %res67}68 69define i32 @fun5(i32 %arg) {70; CHECK-LABEL: fun5:71; CHECK: ahik72; CHECK-NEXT: locrnhe73bb:74 %tmp = add i32 %arg, 175 %tmp1 = icmp slt i32 %tmp, 076 %res = select i1 %tmp1, i32 %tmp, i32 %arg77 ret i32 %res78}79 80; Addition of the minimum value gives a positive or zero result.81define i32 @fun6(i32 %arg) {82; CHECK-LABEL: fun6:83; CHECK: afi84; CHECK-NEXT: chi85; CHECK-NEXT: locre86bb:87 %tmp = add i32 %arg, -214748364888 %tmp1 = icmp eq i32 %tmp, 089 %res = select i1 %tmp1, i32 %tmp, i32 %arg90 ret i32 %res91}92 93define i32 @fun7(i32 %arg) {94; CHECK-LABEL: fun7:95; CHECK: afi96; CHECK-NEXT: chi97; CHECK-NEXT: locrh98bb:99 %tmp = add i32 %arg, -2147483648100 %tmp1 = icmp sgt i32 %tmp, 0101 %res = select i1 %tmp1, i32 %tmp, i32 %arg102 ret i32 %res103}104