1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s 2; 3; Check that signed comparisons against 0 are only eliminated if the "nsw" 4; flag is present on the defining add (with register) instruction. For an 5; equality comparison, add logical can be used. 6 7define i32 @fun0(i32 %arg, i32 %arg2, i32 %arg3) { 8; CHECK-LABEL: fun0: 9; CHECK: jle .LBB0_2{{$}} 10; CHECK: je .LBB0_4{{$}} 11 12bb: 13 %tmp2 = add nsw i32 %arg, %arg2 14 %tmp3 = icmp sgt i32 %tmp2, 0 15 br i1 %tmp3, label %bb3, label %bb1 16 17bb1: 18 %tmp4 = add nsw i32 %arg, %arg3 19 %tmp5 = icmp eq i32 %tmp4, 0 20 br i1 %tmp5, label %bb4, label %bb2 21 22bb2: 23 ret i32 0 24 25bb3: 26 ret i32 1 27 28bb4: 29 ret i32 2 30} 31 32; No "nsw" flag 33define i32 @fun1(i32 %arg, i32 %arg2, i32 %arg3) { 34; CHECK-LABEL: fun1: 35; CHECK: cijle 36; CHECK: alr 37; CHECK: jhe 38 39bb: 40 %tmp2 = add i32 %arg, %arg2 41 %tmp3 = icmp sgt i32 %tmp2, 0 42 br i1 %tmp3, label %bb3, label %bb1 43 44bb1: 45 %tmp4 = add i32 %arg, %arg3 46 %tmp5 = icmp eq i32 %tmp4, 0 47 br i1 %tmp5, label %bb4, label %bb2 48 49bb2: 50 ret i32 0 51 52bb3: 53 ret i32 1 54 55bb4: 56 ret i32 2 57} 58 59; "nuw" flag 60define i32 @fun2(i32 %arg, i32 %arg2, i32 %arg3) { 61; CHECK-LABEL: fun2: 62; CHECK: cijle 63; CHECK: alr 64; CHECK: jhe 65 66bb: 67 %tmp2 = add nuw i32 %arg, %arg2 68 %tmp3 = icmp sgt i32 %tmp2, 0 69 br i1 %tmp3, label %bb3, label %bb1 70 71bb1: 72 %tmp4 = add nuw i32 %arg, %arg3 73 %tmp5 = icmp eq i32 %tmp4, 0 74 br i1 %tmp5, label %bb4, label %bb2 75 76bb2: 77 ret i32 0 78 79bb3: 80 ret i32 1 81 82bb4: 83 ret i32 2 84} 85 86; Subtraction does not produce the value of zero in case of overflow, so 87; "nsw" is not needed for the equality check against zero. 88define i32 @fun3(i32 %arg, i32 %arg2, i32 %arg3) { 89; CHECK-LABEL: fun3: 90; CHECK: jle .LBB3_2{{$}} 91; CHECK: je .LBB3_4{{$}} 92 93bb: 94 %tmp2 = sub nsw i32 %arg, %arg2 95 %tmp3 = icmp sgt i32 %tmp2, 0 96 br i1 %tmp3, label %bb3, label %bb1 97 98bb1: 99 %tmp4 = sub nsw i32 %arg, %arg3 100 %tmp5 = icmp eq i32 %tmp4, 0 101 br i1 %tmp5, label %bb4, label %bb2 102 103bb2: 104 ret i32 0 105 106bb3: 107 ret i32 1 108 109bb4: 110 ret i32 2 111} 112 113; No "nsw" flag 114define i32 @fun4(i32 %arg, i32 %arg2, i32 %arg3) { 115; CHECK-LABEL: fun4: 116; CHECK: cijle 117; CHECK: je .LBB4_4{{$}} 118 119bb: 120 %tmp2 = sub i32 %arg, %arg2 121 %tmp3 = icmp sgt i32 %tmp2, 0 122 br i1 %tmp3, label %bb3, label %bb1 123 124bb1: 125 %tmp4 = sub i32 %arg, %arg3 126 %tmp5 = icmp eq i32 %tmp4, 0 127 br i1 %tmp5, label %bb4, label %bb2 128 129bb2: 130 ret i32 0 131 132bb3: 133 ret i32 1 134 135bb4: 136 ret i32 2 137} 138 139; "nuw" flag 140define i32 @fun5(i32 %arg, i32 %arg2, i32 %arg3) { 141; CHECK-LABEL: fun5: 142; CHECK: cijle 143; CHECK: je .LBB5_4{{$}} 144 145bb: 146 %tmp2 = sub nuw i32 %arg, %arg2 147 %tmp3 = icmp sgt i32 %tmp2, 0 148 br i1 %tmp3, label %bb3, label %bb1 149 150bb1: 151 %tmp4 = sub nuw i32 %arg, %arg3 152 %tmp5 = icmp eq i32 %tmp4, 0 153 br i1 %tmp5, label %bb4, label %bb2 154 155bb2: 156 ret i32 0 157 158bb3: 159 ret i32 1 160 161bb4: 162 ret i32 2 163} 164