brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.3 KiB · 849323f Raw
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