504 lines · plain
1; RUN: llc -debugify-and-strip-all-safe < %s -stress-early-ifcvt -aarch64-enable-atomic-cfg-tidy=0 | FileCheck %s2target triple = "arm64-apple-macosx"3 4; CHECK: mm25define i32 @mm2(ptr nocapture %p, i32 %n) nounwind uwtable readonly ssp {6entry:7 br label %do.body8 9; CHECK: do.body10; Loop body has no branches before the backedge.11; CHECK-NOT: LBB12do.body:13 %max.0 = phi i32 [ 0, %entry ], [ %max.1, %do.cond ]14 %min.0 = phi i32 [ 0, %entry ], [ %min.1, %do.cond ]15 %n.addr.0 = phi i32 [ %n, %entry ], [ %dec, %do.cond ]16 %p.addr.0 = phi ptr [ %p, %entry ], [ %incdec.ptr, %do.cond ]17 %incdec.ptr = getelementptr inbounds i32, ptr %p.addr.0, i64 118 %0 = load i32, ptr %p.addr.0, align 419 %cmp = icmp sgt i32 %0, %max.020 br i1 %cmp, label %do.cond, label %if.else21 22if.else:23 %cmp1 = icmp slt i32 %0, %min.024 %.min.0 = select i1 %cmp1, i32 %0, i32 %min.025 br label %do.cond26 27do.cond:28 %max.1 = phi i32 [ %0, %do.body ], [ %max.0, %if.else ]29 %min.1 = phi i32 [ %min.0, %do.body ], [ %.min.0, %if.else ]30; CHECK: b.ne31 %dec = add i32 %n.addr.0, -132 %tobool = icmp eq i32 %dec, 033 br i1 %tobool, label %do.end, label %do.body34 35do.end:36 %sub = sub nsw i32 %max.1, %min.137 ret i32 %sub38}39 40; CHECK-LABEL: fold_inc_true_32:41; CHECK: {{subs.*wzr,|cmp}} w2, #142; CHECK-NEXT: csinc w0, w1, w0, eq43; CHECK-NEXT: ret44define i32 @fold_inc_true_32(i32 %x, i32 %y, i32 %c) nounwind ssp {45entry:46 %tobool = icmp eq i32 %c, 147 %inc = add nsw i32 %x, 148 br i1 %tobool, label %eq_bb, label %done49 50eq_bb:51 br label %done52 53done:54 %cond = phi i32 [ %y, %eq_bb ], [ %inc, %entry ]55 ret i32 %cond56}57 58; CHECK-LABEL: fold_inc_true_64:59; CHECK: {{subs.*xzr,|cmp}} x2, #160; CHECK-NEXT: csinc x0, x1, x0, eq61; CHECK-NEXT: ret62define i64 @fold_inc_true_64(i64 %x, i64 %y, i64 %c) nounwind ssp {63entry:64 %tobool = icmp eq i64 %c, 165 %inc = add nsw i64 %x, 166 br i1 %tobool, label %eq_bb, label %done67 68eq_bb:69 br label %done70 71done:72 %cond = phi i64 [ %y, %eq_bb ], [ %inc, %entry ]73 ret i64 %cond74}75 76; CHECK-LABEL: fold_inc_false_32:77; CHECK: {{subs.*wzr,|cmp}} w2, #178; CHECK-NEXT: csinc w0, w1, w0, ne79; CHECK-NEXT: ret80define i32 @fold_inc_false_32(i32 %x, i32 %y, i32 %c) nounwind ssp {81entry:82 %tobool = icmp eq i32 %c, 183 %inc = add nsw i32 %x, 184 br i1 %tobool, label %eq_bb, label %done85 86eq_bb:87 br label %done88 89done:90 %cond = phi i32 [ %inc, %eq_bb ], [ %y, %entry ]91 ret i32 %cond92}93 94; CHECK-LABEL: fold_inc_false_64:95; CHECK: {{subs.*xzr,|cmp}} x2, #196; CHECK-NEXT: csinc x0, x1, x0, ne97; CHECK-NEXT: ret98define i64 @fold_inc_false_64(i64 %x, i64 %y, i64 %c) nounwind ssp {99entry:100 %tobool = icmp eq i64 %c, 1101 %inc = add nsw i64 %x, 1102 br i1 %tobool, label %eq_bb, label %done103 104eq_bb:105 br label %done106 107done:108 %cond = phi i64 [ %inc, %eq_bb ], [ %y, %entry ]109 ret i64 %cond110}111 112; CHECK-LABEL: fold_inv_true_32:113; CHECK: {{subs.*wzr,|cmp}} w2, #1114; CHECK-NEXT: csinv w0, w1, w0, eq115; CHECK-NEXT: ret116define i32 @fold_inv_true_32(i32 %x, i32 %y, i32 %c) nounwind ssp {117entry:118 %tobool = icmp eq i32 %c, 1119 %inv = xor i32 %x, -1120 br i1 %tobool, label %eq_bb, label %done121 122eq_bb:123 br label %done124 125done:126 %cond = phi i32 [ %y, %eq_bb ], [ %inv, %entry ]127 ret i32 %cond128}129 130; CHECK-LABEL: fold_inv_true_64:131; CHECK: {{subs.*xzr,|cmp}} x2, #1132; CHECK-NEXT: csinv x0, x1, x0, eq133; CHECK-NEXT: ret134define i64 @fold_inv_true_64(i64 %x, i64 %y, i64 %c) nounwind ssp {135entry:136 %tobool = icmp eq i64 %c, 1137 %inv = xor i64 %x, -1138 br i1 %tobool, label %eq_bb, label %done139 140eq_bb:141 br label %done142 143done:144 %cond = phi i64 [ %y, %eq_bb ], [ %inv, %entry ]145 ret i64 %cond146}147 148; CHECK-LABEL: fold_inv_false_32:149; CHECK: {{subs.*wzr,|cmp}} w2, #1150; CHECK-NEXT: csinv w0, w1, w0, ne151; CHECK-NEXT: ret152define i32 @fold_inv_false_32(i32 %x, i32 %y, i32 %c) nounwind ssp {153entry:154 %tobool = icmp eq i32 %c, 1155 %inv = xor i32 %x, -1156 br i1 %tobool, label %eq_bb, label %done157 158eq_bb:159 br label %done160 161done:162 %cond = phi i32 [ %inv, %eq_bb ], [ %y, %entry ]163 ret i32 %cond164}165 166; CHECK-LABEL: fold_inv_false_64:167; CHECK: {{subs.*xzr,|cmp}} x2, #1168; CHECK-NEXT: csinv x0, x1, x0, ne169; CHECK-NEXT: ret170define i64 @fold_inv_false_64(i64 %x, i64 %y, i64 %c) nounwind ssp {171entry:172 %tobool = icmp eq i64 %c, 1173 %inv = xor i64 %x, -1174 br i1 %tobool, label %eq_bb, label %done175 176eq_bb:177 br label %done178 179done:180 %cond = phi i64 [ %inv, %eq_bb ], [ %y, %entry ]181 ret i64 %cond182}183 184; CHECK-LABEL: fold_neg_true_32:185; CHECK: {{subs.*wzr,|cmp}} w2, #1186; CHECK-NEXT: csneg w0, w1, w0, eq187; CHECK-NEXT: ret188define i32 @fold_neg_true_32(i32 %x, i32 %y, i32 %c) nounwind ssp {189entry:190 %tobool = icmp eq i32 %c, 1191 %neg = sub nsw i32 0, %x192 br i1 %tobool, label %eq_bb, label %done193 194eq_bb:195 br label %done196 197done:198 %cond = phi i32 [ %y, %eq_bb ], [ %neg, %entry ]199 ret i32 %cond200}201 202; CHECK-LABEL: fold_neg_true_64:203; CHECK: {{subs.*xzr,|cmp}} x2, #1204; CHECK-NEXT: csneg x0, x1, x0, eq205; CHECK-NEXT: ret206define i64 @fold_neg_true_64(i64 %x, i64 %y, i64 %c) nounwind ssp {207entry:208 %tobool = icmp eq i64 %c, 1209 %neg = sub nsw i64 0, %x210 br i1 %tobool, label %eq_bb, label %done211 212eq_bb:213 br label %done214 215done:216 %cond = phi i64 [ %y, %eq_bb ], [ %neg, %entry ]217 ret i64 %cond218}219 220; CHECK-LABEL: fold_neg_false_32:221; CHECK: {{subs.*wzr,|cmp}} w2, #1222; CHECK-NEXT: csneg w0, w1, w0, ne223; CHECK-NEXT: ret224define i32 @fold_neg_false_32(i32 %x, i32 %y, i32 %c) nounwind ssp {225entry:226 %tobool = icmp eq i32 %c, 1227 %neg = sub nsw i32 0, %x228 br i1 %tobool, label %eq_bb, label %done229 230eq_bb:231 br label %done232 233done:234 %cond = phi i32 [ %neg, %eq_bb ], [ %y, %entry ]235 ret i32 %cond236}237 238; CHECK-LABEL: fold_neg_false_64:239; CHECK: {{subs.*xzr,|cmp}} x2, #1240; CHECK-NEXT: csneg x0, x1, x0, ne241; CHECK-NEXT: ret242define i64 @fold_neg_false_64(i64 %x, i64 %y, i64 %c) nounwind ssp {243entry:244 %tobool = icmp eq i64 %c, 1245 %neg = sub nsw i64 0, %x246 br i1 %tobool, label %eq_bb, label %done247 248eq_bb:249 br label %done250 251done:252 %cond = phi i64 [ %neg, %eq_bb ], [ %y, %entry ]253 ret i64 %cond254}255 256; CHECK: cbnz_32257; CHECK: {{subs.*wzr,|cmp}} w2, #0258; CHECK-NEXT: csel w0, w1, w0, ne259; CHECK-NEXT: ret260define i32 @cbnz_32(i32 %x, i32 %y, i32 %c) nounwind ssp {261entry:262 %tobool = icmp eq i32 %c, 0263 br i1 %tobool, label %eq_bb, label %done264 265eq_bb:266 br label %done267 268done:269 %cond = phi i32 [ %x, %eq_bb ], [ %y, %entry ]270 ret i32 %cond271}272 273; CHECK: cbnz_64274; CHECK: {{subs.*xzr,|cmp}} x2, #0275; CHECK-NEXT: csel x0, x1, x0, ne276; CHECK-NEXT: ret277define i64 @cbnz_64(i64 %x, i64 %y, i64 %c) nounwind ssp {278entry:279 %tobool = icmp eq i64 %c, 0280 br i1 %tobool, label %eq_bb, label %done281 282eq_bb:283 br label %done284 285done:286 %cond = phi i64 [ %x, %eq_bb ], [ %y, %entry ]287 ret i64 %cond288}289 290; CHECK: cbz_32291; CHECK: {{subs.*wzr,|cmp}} w2, #0292; CHECK-NEXT: csel w0, w1, w0, eq293; CHECK-NEXT: ret294define i32 @cbz_32(i32 %x, i32 %y, i32 %c) nounwind ssp {295entry:296 %tobool = icmp ne i32 %c, 0297 br i1 %tobool, label %ne_bb, label %done298 299ne_bb:300 br label %done301 302done:303 %cond = phi i32 [ %x, %ne_bb ], [ %y, %entry ]304 ret i32 %cond305}306 307; CHECK: cbz_64308; CHECK: {{subs.*xzr,|cmp}} x2, #0309; CHECK-NEXT: csel x0, x1, x0, eq310; CHECK-NEXT: ret311define i64 @cbz_64(i64 %x, i64 %y, i64 %c) nounwind ssp {312entry:313 %tobool = icmp ne i64 %c, 0314 br i1 %tobool, label %ne_bb, label %done315 316ne_bb:317 br label %done318 319done:320 %cond = phi i64 [ %x, %ne_bb ], [ %y, %entry ]321 ret i64 %cond322}323 324; CHECK: tbnz_32325; CHECK: {{ands.*xzr,|tst}} w2, #0x80326; CHECK-NEXT: csel w0, w1, w0, ne327; CHECK-NEXT: ret328define i32 @tbnz_32(i32 %x, i32 %y, i32 %c) nounwind ssp {329entry:330 %mask = and i32 %c, 128331 %tobool = icmp eq i32 %mask, 0332 br i1 %tobool, label %eq_bb, label %done333 334eq_bb:335 br label %done336 337done:338 %cond = phi i32 [ %x, %eq_bb ], [ %y, %entry ]339 ret i32 %cond340}341 342; CHECK: tbnz_64343; CHECK: {{ands.*xzr,|tst}} x2, #0x8000000000000000344; CHECK-NEXT: csel x0, x1, x0, ne345; CHECK-NEXT: ret346define i64 @tbnz_64(i64 %x, i64 %y, i64 %c) nounwind ssp {347entry:348 %mask = and i64 %c, 9223372036854775808349 %tobool = icmp eq i64 %mask, 0350 br i1 %tobool, label %eq_bb, label %done351 352eq_bb:353 br label %done354 355done:356 %cond = phi i64 [ %x, %eq_bb ], [ %y, %entry ]357 ret i64 %cond358}359 360; CHECK: tbz_32361; CHECK: {{ands.*xzr,|tst}} w2, #0x80362; CHECK-NEXT: csel w0, w1, w0, eq363; CHECK-NEXT: ret364define i32 @tbz_32(i32 %x, i32 %y, i32 %c) nounwind ssp {365entry:366 %mask = and i32 %c, 128367 %tobool = icmp ne i32 %mask, 0368 br i1 %tobool, label %ne_bb, label %done369 370ne_bb:371 br label %done372 373done:374 %cond = phi i32 [ %x, %ne_bb ], [ %y, %entry ]375 ret i32 %cond376}377 378; CHECK: tbz_64379; CHECK: {{ands.*xzr,|tst}} x2, #0x8000000000000000380; CHECK-NEXT: csel x0, x1, x0, eq381; CHECK-NEXT: ret382define i64 @tbz_64(i64 %x, i64 %y, i64 %c) nounwind ssp {383entry:384 %mask = and i64 %c, 9223372036854775808385 %tobool = icmp ne i64 %mask, 0386 br i1 %tobool, label %ne_bb, label %done387 388ne_bb:389 br label %done390 391done:392 %cond = phi i64 [ %x, %ne_bb ], [ %y, %entry ]393 ret i64 %cond394}395 396; This function from 175.vpr folds an ADDWri into a CSINC.397; Remember to clear the kill flag on the ADDWri.398define i32 @get_ytrack_to_xtracks(i1 %arg) nounwind ssp {399entry:400 br label %for.body401 402for.body:403 %x0 = load i32, ptr undef, align 4404 br i1 %arg, label %if.then.i146, label %is_sbox.exit155405 406if.then.i146:407 %add8.i143 = add nsw i32 0, %x0408 %rem.i144 = srem i32 %add8.i143, %x0409 %add9.i145 = add i32 %rem.i144, 1410 br label %is_sbox.exit155411 412is_sbox.exit155: ; preds = %if.then.i146, %for.body413 %seg_offset.0.i151 = phi i32 [ %add9.i145, %if.then.i146 ], [ undef, %for.body ]414 %idxprom15.i152 = sext i32 %seg_offset.0.i151 to i64415 %arrayidx18.i154 = getelementptr inbounds i32, ptr null, i64 %idxprom15.i152416 %x1 = load i32, ptr %arrayidx18.i154, align 4417 br i1 %arg, label %for.body51, label %for.body418 419for.body51: ; preds = %is_sbox.exit155420 call fastcc void @get_switch_type(i32 %x1, i32 undef, i16 signext undef, i16 signext undef, ptr undef)421 unreachable422}423declare fastcc void @get_switch_type(i32, i32, i16 signext, i16 signext, ptr nocapture) nounwind ssp424 425; CHECK-LABEL: fold_imm1_csinc_32:426; CHECK: cmp w0, w1427; CHECK-NEXT: csinc w0, w2, wzr, ge428; CHECK-NEXT: ret429define i32 @fold_imm1_csinc_32(i32 %x, i32 %y, i32 %n) nounwind ssp {430entry:431 %cmp = icmp slt i32 %x, %y432 br i1 %cmp, label %if.then, label %if.else433 434if.then:435 br label %exit436 437if.else:438 br label %exit439 440exit:441 %result = phi i32 [ 1, %if.then ], [ %n, %if.else ]442 ret i32 %result443}444 445; CHECK-LABEL: fold_imm1_csinc_64:446; CHECK: cmp x0, x1447; CHECK-NEXT: csinc x0, x2, xzr, ge448; CHECK-NEXT: ret449define i64 @fold_imm1_csinc_64(i64 %x, i64 %y, i64 %n) nounwind ssp {450entry:451 %cmp = icmp slt i64 %x, %y452 br i1 %cmp, label %if.then, label %if.else453 454if.then:455 br label %exit456 457if.else:458 br label %exit459 460exit:461 %result = phi i64 [ 1, %if.then ], [ %n, %if.else ]462 ret i64 %result463}464 465; CHECK-LABEL: fold_imm1_cset_32:466; CHECK: cmp w0, w1467; CHECK-NEXT: cset w0, lt468; CHECK-NEXT: ret469define i32 @fold_imm1_cset_32(i32 %x, i32 %y) nounwind ssp {470entry:471 %cmp = icmp slt i32 %x, %y472 br i1 %cmp, label %if.then, label %if.else473 474if.then:475 br label %exit476 477if.else:478 br label %exit479 480exit:481 %result = phi i32 [ 1, %if.then ], [ 0, %if.else ]482 ret i32 %result483}484 485; CHECK-LABEL: fold_imm1_cset_64:486; CHECK: cmp x0, x1487; CHECK-NEXT: cset x0, lt488; CHECK-NEXT: ret489define i64 @fold_imm1_cset_64(i64 %x, i64 %y) nounwind ssp {490entry:491 %cmp = icmp slt i64 %x, %y492 br i1 %cmp, label %if.then, label %if.else493 494if.then:495 br label %exit496 497if.else:498 br label %exit499 500exit:501 %result = phi i64 [ 1, %if.then ], [ 0, %if.else ]502 ret i64 %result503}504