164 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s2;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 an5; 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, %arg214 %tmp3 = icmp sgt i32 %tmp2, 015 br i1 %tmp3, label %bb3, label %bb116 17bb1:18 %tmp4 = add nsw i32 %arg, %arg319 %tmp5 = icmp eq i32 %tmp4, 020 br i1 %tmp5, label %bb4, label %bb221 22bb2:23 ret i32 024 25bb3:26 ret i32 127 28bb4:29 ret i32 230}31 32; No "nsw" flag33define i32 @fun1(i32 %arg, i32 %arg2, i32 %arg3) {34; CHECK-LABEL: fun1:35; CHECK: cijle36; CHECK: alr37; CHECK: jhe38 39bb:40 %tmp2 = add i32 %arg, %arg241 %tmp3 = icmp sgt i32 %tmp2, 042 br i1 %tmp3, label %bb3, label %bb143 44bb1:45 %tmp4 = add i32 %arg, %arg346 %tmp5 = icmp eq i32 %tmp4, 047 br i1 %tmp5, label %bb4, label %bb248 49bb2:50 ret i32 051 52bb3:53 ret i32 154 55bb4:56 ret i32 257}58 59; "nuw" flag60define i32 @fun2(i32 %arg, i32 %arg2, i32 %arg3) {61; CHECK-LABEL: fun2:62; CHECK: cijle63; CHECK: alr64; CHECK: jhe65 66bb:67 %tmp2 = add nuw i32 %arg, %arg268 %tmp3 = icmp sgt i32 %tmp2, 069 br i1 %tmp3, label %bb3, label %bb170 71bb1:72 %tmp4 = add nuw i32 %arg, %arg373 %tmp5 = icmp eq i32 %tmp4, 074 br i1 %tmp5, label %bb4, label %bb275 76bb2:77 ret i32 078 79bb3:80 ret i32 181 82bb4:83 ret i32 284}85 86; Subtraction does not produce the value of zero in case of overflow, so87; "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, %arg295 %tmp3 = icmp sgt i32 %tmp2, 096 br i1 %tmp3, label %bb3, label %bb197 98bb1:99 %tmp4 = sub nsw i32 %arg, %arg3100 %tmp5 = icmp eq i32 %tmp4, 0101 br i1 %tmp5, label %bb4, label %bb2102 103bb2:104 ret i32 0105 106bb3:107 ret i32 1108 109bb4:110 ret i32 2111}112 113; No "nsw" flag114define i32 @fun4(i32 %arg, i32 %arg2, i32 %arg3) {115; CHECK-LABEL: fun4:116; CHECK: cijle117; CHECK: je .LBB4_4{{$}}118 119bb:120 %tmp2 = sub i32 %arg, %arg2121 %tmp3 = icmp sgt i32 %tmp2, 0122 br i1 %tmp3, label %bb3, label %bb1123 124bb1:125 %tmp4 = sub i32 %arg, %arg3126 %tmp5 = icmp eq i32 %tmp4, 0127 br i1 %tmp5, label %bb4, label %bb2128 129bb2:130 ret i32 0131 132bb3:133 ret i32 1134 135bb4:136 ret i32 2137}138 139; "nuw" flag140define i32 @fun5(i32 %arg, i32 %arg2, i32 %arg3) {141; CHECK-LABEL: fun5:142; CHECK: cijle143; CHECK: je .LBB5_4{{$}}144 145bb:146 %tmp2 = sub nuw i32 %arg, %arg2147 %tmp3 = icmp sgt i32 %tmp2, 0148 br i1 %tmp3, label %bb3, label %bb1149 150bb1:151 %tmp4 = sub nuw i32 %arg, %arg3152 %tmp5 = icmp eq i32 %tmp4, 0153 br i1 %tmp5, label %bb4, label %bb2154 155bb2:156 ret i32 0157 158bb3:159 ret i32 1160 161bb4:162 ret i32 2163}164