|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 |
| 2 | +; RUN: opt -passes='default<O2>' -S %s | FileCheck %s |
| 3 | + |
| 4 | +target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" |
| 5 | +target triple = "arm64-apple-macosx" |
| 6 | + |
| 7 | +define i1 @test_order_1(ptr %this, ptr noalias %other, i1 %tobool9.not, i32 %call) { |
| 8 | +; CHECK-LABEL: define i1 @test_order_1( |
| 9 | +; CHECK-SAME: ptr nocapture writeonly [[THIS:%.*]], ptr noalias [[OTHER:%.*]], i1 [[TOBOOL9_NOT:%.*]], i32 [[CALL:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { |
| 10 | +; CHECK-NEXT: entry: |
| 11 | +; CHECK-NEXT: br i1 [[TOBOOL9_NOT]], label [[EXIT:%.*]], label [[FOR_COND_PREHEADER:%.*]] |
| 12 | +; CHECK: for.cond.preheader: |
| 13 | +; CHECK-NEXT: [[CMP40_NOT4:%.*]] = icmp slt i32 [[CALL]], 1 |
| 14 | +; CHECK-NEXT: br i1 [[CMP40_NOT4]], label [[FOR_COND41_PREHEADER_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]] |
| 15 | +; CHECK: for.cond41.preheader.preheader: |
| 16 | +; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[CALL]] to i64 |
| 17 | +; CHECK-NEXT: br label [[FOR_COND41_PREHEADER:%.*]] |
| 18 | +; CHECK: for.cond: |
| 19 | +; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nsw i64 [[INDVARS_IV:%.*]], 1 |
| 20 | +; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[INDVARS_IV_NEXT]], 4294967295 |
| 21 | +; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[TMP1]], 1 |
| 22 | +; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_COND41_PREHEADER]] |
| 23 | +; CHECK: for.cond41.preheader: |
| 24 | +; CHECK-NEXT: [[INDVARS_IV]] = phi i64 [ [[TMP0]], [[FOR_COND41_PREHEADER_PREHEADER]] ], [ [[INDVARS_IV_NEXT]], [[FOR_COND:%.*]] ] |
| 25 | +; CHECK-NEXT: [[CALL432:%.*]] = load volatile i32, ptr [[OTHER]], align 4 |
| 26 | +; CHECK-NEXT: [[CMP443:%.*]] = icmp sgt i32 [[CALL432]], 0 |
| 27 | +; CHECK-NEXT: br i1 [[CMP443]], label [[FOR_BODY45_LR_PH:%.*]], label [[FOR_COND]] |
| 28 | +; CHECK: for.body45.lr.ph: |
| 29 | +; CHECK-NEXT: [[ARRAYIDX_I_I:%.*]] = getelementptr ptr, ptr [[OTHER]], i64 [[INDVARS_IV]] |
| 30 | +; CHECK-NEXT: br label [[FOR_BODY45:%.*]] |
| 31 | +; CHECK: for.cond.cleanup.loopexit: |
| 32 | +; CHECK-NEXT: [[CMP40_NOT:%.*]] = icmp slt i64 [[INDVARS_IV]], 0 |
| 33 | +; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] |
| 34 | +; CHECK: for.cond.cleanup: |
| 35 | +; CHECK-NEXT: [[CMP40_NOT_LCSSA:%.*]] = phi i1 [ false, [[FOR_COND_PREHEADER]] ], [ [[CMP40_NOT]], [[FOR_COND_CLEANUP_LOOPEXIT]] ] |
| 36 | +; CHECK-NEXT: store i32 0, ptr [[THIS]], align 4 |
| 37 | +; CHECK-NEXT: br label [[EXIT]] |
| 38 | +; CHECK: for.body45: |
| 39 | +; CHECK-NEXT: [[CALL49:%.*]] = load volatile i1, ptr [[ARRAYIDX_I_I]], align 1 |
| 40 | +; CHECK-NEXT: [[CALL43:%.*]] = load volatile i32, ptr [[OTHER]], align 4 |
| 41 | +; CHECK-NEXT: [[CMP44:%.*]] = icmp sgt i32 [[CALL43]], 0 |
| 42 | +; CHECK-NEXT: br i1 [[CMP44]], label [[FOR_BODY45]], label [[FOR_COND]] |
| 43 | +; CHECK: exit: |
| 44 | +; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP40_NOT_LCSSA]], [[FOR_COND_CLEANUP]] ] |
| 45 | +; CHECK-NEXT: ret i1 [[TMP2]] |
| 46 | +; |
| 47 | +entry: |
| 48 | + %retval1 = alloca i1, i32 0, align 1 |
| 49 | + br i1 %tobool9.not, label %exit, label %for.cond |
| 50 | + |
| 51 | +for.cond: ; preds = %for.inc57, %entry |
| 52 | + %0 = phi i32 [ %inc58, %for.inc57 ], [ %call, %entry ] |
| 53 | + %cmp40.not = icmp sgt i32 %0, 0 |
| 54 | + br i1 %cmp40.not, label %for.cond.cleanup, label %for.cond41 |
| 55 | + |
| 56 | +for.cond.cleanup: ; preds = %for.cond |
| 57 | + store i32 0, ptr %this, align 4 |
| 58 | + br label %cleanup59 |
| 59 | + |
| 60 | +for.cond41: ; preds = %for.body45, %for.cond |
| 61 | + %call43 = load volatile i32, ptr %other, align 4 |
| 62 | + %cmp44 = icmp sgt i32 %call43, 0 |
| 63 | + br i1 %cmp44, label %for.body45, label %for.end |
| 64 | + |
| 65 | +for.body45: ; preds = %for.cond41 |
| 66 | + %idxprom.i.i = sext i32 %0 to i64 |
| 67 | + %arrayidx.i.i = getelementptr ptr, ptr %other, i64 %idxprom.i.i |
| 68 | + %call49 = load volatile i1, ptr %arrayidx.i.i, align 1 |
| 69 | + br label %for.cond41 |
| 70 | + |
| 71 | +for.end: ; preds = %for.cond41 |
| 72 | + br i1 %tobool9.not, label %cleanup59, label %for.inc57 |
| 73 | + |
| 74 | +for.inc57: ; preds = %for.end |
| 75 | + %inc58 = add nsw i32 %0, 1 |
| 76 | + br label %for.cond |
| 77 | + |
| 78 | +cleanup59: ; preds = %for.end, %for.cond.cleanup |
| 79 | + %cleanup.dest60 = phi i32 [ 0, %for.end ], [ 2, %for.cond.cleanup ] |
| 80 | + %cond1 = icmp eq i32 %cleanup.dest60, 2 |
| 81 | + br i1 %cond1, label %for.end61, label %exit |
| 82 | + |
| 83 | +for.end61: ; preds = %cleanup59 |
| 84 | + store i1 false, ptr %retval1, align 1 |
| 85 | + br label %exit |
| 86 | + |
| 87 | +exit: ; preds = %for.end61, %cleanup59, %entry |
| 88 | + %1 = phi i1 [ false, %for.end61 ], [ true, %cleanup59 ], [ false, %entry ] |
| 89 | + ret i1 %1 |
| 90 | +} |
| 91 | + |
| 92 | +%struct = type { ptr, i64, i64 } |
| 93 | + |
| 94 | +@.str.78 = constant [12 x i8] c"--test-info\00" |
| 95 | +@.str.79 = constant [14 x i8] c"--test-noinfo\00" |
| 96 | +@.str.80 = constant [18 x i8] c"--test-nocompress\00" |
| 97 | + |
| 98 | +declare i64 @strlen(ptr) |
| 99 | + |
| 100 | +define void @test2(ptr %this) #0 { |
| 101 | +; CHECK-LABEL: define void @test2( |
| 102 | +; CHECK-SAME: ptr nocapture writeonly [[THIS:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] { |
| 103 | +; CHECK-NEXT: entry: |
| 104 | +; CHECK-NEXT: [[CALL1_I_I:%.*]] = tail call i1 @test2_fn4(i8 undef) |
| 105 | +; CHECK-NEXT: [[CALL2_I_I:%.*]] = load i64, ptr inttoptr (i64 8 to ptr), align 8 |
| 106 | +; CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[CALL1_I_I]], i64 [[CALL2_I_I]], i64 0 |
| 107 | +; CHECK-NEXT: switch i64 [[COND_I_I]], label [[COMMON_RET:%.*]] [ |
| 108 | +; CHECK-NEXT: i64 11, label [[IF_END_I:%.*]] |
| 109 | +; CHECK-NEXT: i64 13, label [[TEST2_FN2_EXIT12:%.*]] |
| 110 | +; CHECK-NEXT: i64 17, label [[IF_END_I31:%.*]] |
| 111 | +; CHECK-NEXT: ] |
| 112 | +; CHECK: if.end.i: |
| 113 | +; CHECK-NEXT: [[CALL8_I_I:%.*]] = tail call fastcc i32 @test2_fn6() |
| 114 | +; CHECK-NEXT: [[TRUNC_I_I:%.*]] = trunc i32 [[CALL8_I_I]] to i8 |
| 115 | +; CHECK-NEXT: [[CALL1_I1_I:%.*]] = tail call i1 @test2_fn4(i8 [[TRUNC_I_I]]) |
| 116 | +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[CALL1_I1_I]], true |
| 117 | +; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP0]]) |
| 118 | +; CHECK-NEXT: br label [[COMMON_RET]] |
| 119 | +; CHECK: test2_fn2.exit12: |
| 120 | +; CHECK-NEXT: [[CALL8_I_I8:%.*]] = tail call fastcc i32 @test2_fn6() |
| 121 | +; CHECK-NEXT: [[TRUNC_I_I9:%.*]] = trunc i32 [[CALL8_I_I8]] to i8 |
| 122 | +; CHECK-NEXT: [[CALL1_I1_I10:%.*]] = tail call i1 @test2_fn4(i8 [[TRUNC_I_I9]]) |
| 123 | +; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[CALL1_I1_I10]], true |
| 124 | +; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP1]]) |
| 125 | +; CHECK-NEXT: [[CMP4_I11:%.*]] = icmp eq i32 [[CALL8_I_I8]], 0 |
| 126 | +; CHECK-NEXT: br i1 [[CMP4_I11]], label [[TEST2_FN2_EXIT24:%.*]], label [[COMMON_RET]] |
| 127 | +; CHECK: common.ret: |
| 128 | +; CHECK-NEXT: ret void |
| 129 | +; CHECK: test2_fn2.exit24: |
| 130 | +; CHECK-NEXT: store i8 0, ptr [[THIS]], align 4 |
| 131 | +; CHECK-NEXT: br label [[COMMON_RET]] |
| 132 | +; CHECK: if.end.i31: |
| 133 | +; CHECK-NEXT: [[DOTPRE:%.*]] = tail call fastcc i32 @test2_fn6() |
| 134 | +; CHECK-NEXT: [[DOTPRE38:%.*]] = trunc i32 [[DOTPRE]] to i8 |
| 135 | +; CHECK-NEXT: [[DOTPRE39:%.*]] = tail call i1 @test2_fn4(i8 [[DOTPRE38]]) |
| 136 | +; CHECK-NEXT: [[DOTPRE40:%.*]] = xor i1 [[DOTPRE39]], true |
| 137 | +; CHECK-NEXT: tail call void @llvm.assume(i1 [[DOTPRE40]]) |
| 138 | +; CHECK-NEXT: br label [[COMMON_RET]] |
| 139 | +; |
| 140 | +entry: |
| 141 | + %call16 = call i1 @test2_fn2(ptr @.str.78) |
| 142 | + %call17 = call i1 @test2_fn2(ptr @.str.79) |
| 143 | + br i1 %call17, label %if.then18, label %if.else21 |
| 144 | + |
| 145 | +common.ret: ; preds = %if.else21, %if.then18 |
| 146 | + ret void |
| 147 | + |
| 148 | +if.then18: ; preds = %entry |
| 149 | + %call19 = call i1 @test2_fn2(ptr @.str.78) |
| 150 | + %frombool20 = zext i1 %call19 to i8 |
| 151 | + store i8 %frombool20, ptr %this, align 4 |
| 152 | + br label %common.ret |
| 153 | + |
| 154 | +if.else21: ; preds = %entry |
| 155 | + %call22 = call i1 @test2_fn2(ptr @.str.80) |
| 156 | + br label %common.ret |
| 157 | +} |
| 158 | + |
| 159 | +define i1 @test2_fn2(ptr %__rhs) #0 { |
| 160 | +; CHECK-LABEL: define i1 @test2_fn2( |
| 161 | +; CHECK-SAME: ptr nocapture readonly [[__RHS:%.*]]) local_unnamed_addr #[[ATTR3:[0-9]+]] { |
| 162 | +; CHECK-NEXT: entry: |
| 163 | +; CHECK-NEXT: [[CALL:%.*]] = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[__RHS]]) |
| 164 | +; CHECK-NEXT: [[CALL1_I:%.*]] = tail call i1 @test2_fn4(i8 undef) |
| 165 | +; CHECK-NEXT: [[CALL2_I:%.*]] = load i64, ptr inttoptr (i64 8 to ptr), align 8 |
| 166 | +; CHECK-NEXT: [[COND_I:%.*]] = select i1 [[CALL1_I]], i64 [[CALL2_I]], i64 0 |
| 167 | +; CHECK-NEXT: [[CMP2_NOT:%.*]] = icmp eq i64 [[CALL]], [[COND_I]] |
| 168 | +; CHECK-NEXT: br i1 [[CMP2_NOT]], label [[IF_END:%.*]], label [[CLEANUP:%.*]] |
| 169 | +; CHECK: if.end: |
| 170 | +; CHECK-NEXT: [[CALL8_I:%.*]] = tail call fastcc i32 @test2_fn6() |
| 171 | +; CHECK-NEXT: [[TRUNC_I:%.*]] = trunc i32 [[CALL8_I]] to i8 |
| 172 | +; CHECK-NEXT: [[CALL1_I1:%.*]] = tail call i1 @test2_fn4(i8 [[TRUNC_I]]) |
| 173 | +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[CALL1_I1]], true |
| 174 | +; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP0]]) |
| 175 | +; CHECK-NEXT: [[CMP4:%.*]] = icmp eq i32 [[CALL8_I]], 0 |
| 176 | +; CHECK-NEXT: br label [[CLEANUP]] |
| 177 | +; CHECK: cleanup: |
| 178 | +; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i1 [ [[CMP4]], [[IF_END]] ], [ false, [[ENTRY:%.*]] ] |
| 179 | +; CHECK-NEXT: ret i1 [[RETVAL_0]] |
| 180 | +; |
| 181 | +entry: |
| 182 | + %call = call i64 @strlen(ptr %__rhs) |
| 183 | + %call1 = call i64 @test2_fn3(ptr null) |
| 184 | + %cmp2.not = icmp eq i64 %call, %call1 |
| 185 | + br i1 %cmp2.not, label %if.end, label %cleanup |
| 186 | + |
| 187 | +if.end: ; preds = %entry |
| 188 | + %call3 = call i32 @test2_fn5() |
| 189 | + %cmp4 = icmp eq i32 %call3, 0 |
| 190 | + br label %cleanup |
| 191 | + |
| 192 | +cleanup: ; preds = %if.end, %entry |
| 193 | + %retval.0 = phi i1 [ %cmp4, %if.end ], [ false, %entry ] |
| 194 | + ret i1 %retval.0 |
| 195 | +} |
| 196 | + |
| 197 | +declare void @llvm.assume(i1 noundef) |
| 198 | + |
| 199 | +define internal i64 @test2_fn3(ptr align 8 dereferenceable(24) %this) #0 { |
| 200 | +entry: |
| 201 | + %l = load i8, ptr %this |
| 202 | + %call1 = call i1 @test2_fn4(i8 %l) |
| 203 | + br i1 %call1, label %cond.true, label %cond.end |
| 204 | + |
| 205 | +cond.true: ; preds = %entry |
| 206 | + %__size_ = getelementptr %struct, ptr %this, i64 0, i32 1 |
| 207 | + %call2 = load i64, ptr %__size_, align 8 |
| 208 | + |
| 209 | + br label %cond.end |
| 210 | + |
| 211 | +cond.end: ; preds = %cond.true, %entry |
| 212 | + %cond = phi i64 [ %call2, %cond.true ], [ 0, %entry ] |
| 213 | + ret i64 %cond |
| 214 | +} |
| 215 | + |
| 216 | +define i1 @test2_fn4(i8 %bf.load) { |
| 217 | +; CHECK-LABEL: define i1 @test2_fn4( |
| 218 | +; CHECK-SAME: i8 [[BF_LOAD:%.*]]) local_unnamed_addr #[[ATTR5:[0-9]+]] { |
| 219 | +; CHECK-NEXT: entry: |
| 220 | +; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i8 [[BF_LOAD]], 0 |
| 221 | +; CHECK-NEXT: ret i1 [[TOBOOL]] |
| 222 | +; |
| 223 | +entry: |
| 224 | + %tobool = icmp slt i8 %bf.load, 0 |
| 225 | + ret i1 %tobool |
| 226 | +} |
| 227 | + |
| 228 | +define internal i32 @test2_fn5() #0 { |
| 229 | +entry: |
| 230 | + %call8 = call i32 @test2_fn6() |
| 231 | + %trunc = trunc i32 %call8 to i8 |
| 232 | + %call1 = call i1 @test2_fn4(i8 %trunc) |
| 233 | + %0 = xor i1 %call1, true |
| 234 | + call void @llvm.assume(i1 %0) |
| 235 | + ret i32 %call8 |
| 236 | +} |
| 237 | + |
| 238 | +define internal i32 @test2_fn6() { |
| 239 | +; CHECK-LABEL: define internal fastcc i32 @test2_fn6( |
| 240 | +; CHECK-SAME: ) unnamed_addr #[[ATTR5]] { |
| 241 | +; CHECK-NEXT: entry: |
| 242 | +; CHECK-NEXT: ret i32 0 |
| 243 | +; |
| 244 | +entry: |
| 245 | + %call = call i32 @memcmp(ptr @.str.79, ptr @.str.79, i64 2) |
| 246 | + ret i32 %call |
| 247 | +} |
| 248 | + |
| 249 | +declare i32 @memcmp(ptr, ptr, i64) |
| 250 | + |
| 251 | +attributes #0 = { "target-cpu"="apple-m1" } |
0 commit comments