Skip to content

Commit 33761df

Browse files
Revert "[SimpleLoopUnswitch] Record loops from unswitching non-trivial conditions"
This reverts commit e9de32f due to multiple performance regressions observed across downstream Numba benchmarks (#138509 (comment)). While avoiding non-trivial unswitches on newly-cloned loops helps mitigate the pathological case reported in #138509, it may as well make the IR less friendly to vectorization / loop- canonicalization (in the test reported, previously no select with loop-carried dependence existed in the new specialized loops), leading the abovementioned approach to be reconsidered.
1 parent 17f5f5b commit 33761df

17 files changed

+528
-412
lines changed

llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2144,36 +2144,34 @@ void visitDomSubTree(DominatorTree &DT, BasicBlock *BB, CallableT Callable) {
21442144
void postUnswitch(Loop &L, LPMUpdater &U, StringRef LoopName,
21452145
bool CurrentLoopValid, bool PartiallyInvariant,
21462146
bool InjectedCondition, ArrayRef<Loop *> NewLoops) {
2147-
auto RecordLoopAsUnswitched = [&](Loop *TargetLoop, StringRef Tag,
2148-
StringRef DisableTag) {
2149-
auto &Ctx = TargetLoop->getHeader()->getContext();
2150-
MDNode *DisableMD = MDNode::get(Ctx, MDString::get(Ctx, DisableTag));
2151-
MDNode *NewLoopID = makePostTransformationMetadata(
2152-
Ctx, TargetLoop->getLoopID(), {Tag}, {DisableMD});
2153-
TargetLoop->setLoopID(NewLoopID);
2154-
};
2155-
2156-
// If we performed a non-trivial unswitch, we have added new cloned loops.
2157-
// Mark such newly-created loops as visited.
2158-
if (!NewLoops.empty()) {
2159-
for (Loop *NL : NewLoops)
2160-
RecordLoopAsUnswitched(NL, "llvm.loop.unswitch.nontrivial",
2161-
"llvm.loop.unswitch.nontrivial.disable");
2147+
// If we did a non-trivial unswitch, we have added new (cloned) loops.
2148+
if (!NewLoops.empty())
21622149
U.addSiblingLoops(NewLoops);
2163-
}
21642150

21652151
// If the current loop remains valid, we should revisit it to catch any
21662152
// other unswitch opportunities. Otherwise, we need to mark it as deleted.
21672153
if (CurrentLoopValid) {
21682154
if (PartiallyInvariant) {
21692155
// Mark the new loop as partially unswitched, to avoid unswitching on
21702156
// the same condition again.
2171-
RecordLoopAsUnswitched(&L, "llvm.loop.unswitch.partial",
2172-
"llvm.loop.unswitch.partial.disable");
2157+
auto &Context = L.getHeader()->getContext();
2158+
MDNode *DisableUnswitchMD = MDNode::get(
2159+
Context,
2160+
MDString::get(Context, "llvm.loop.unswitch.partial.disable"));
2161+
MDNode *NewLoopID = makePostTransformationMetadata(
2162+
Context, L.getLoopID(), {"llvm.loop.unswitch.partial"},
2163+
{DisableUnswitchMD});
2164+
L.setLoopID(NewLoopID);
21732165
} else if (InjectedCondition) {
21742166
// Do the same for injection of invariant conditions.
2175-
RecordLoopAsUnswitched(&L, "llvm.loop.unswitch.injection",
2176-
"llvm.loop.unswitch.injection.disable");
2167+
auto &Context = L.getHeader()->getContext();
2168+
MDNode *DisableUnswitchMD = MDNode::get(
2169+
Context,
2170+
MDString::get(Context, "llvm.loop.unswitch.injection.disable"));
2171+
MDNode *NewLoopID = makePostTransformationMetadata(
2172+
Context, L.getLoopID(), {"llvm.loop.unswitch.injection"},
2173+
{DisableUnswitchMD});
2174+
L.setLoopID(NewLoopID);
21772175
} else
21782176
U.revisitCurrentLoop();
21792177
} else
@@ -2811,9 +2809,9 @@ static BranchInst *turnGuardIntoBranch(IntrinsicInst *GI, Loop &L,
28112809
}
28122810

28132811
/// Cost multiplier is a way to limit potentially exponential behavior
2814-
/// of loop-unswitch. Cost is multiplied in proportion of 2^number of unswitch
2815-
/// candidates available. Also consider the number of "sibling" loops with
2816-
/// the idea of accounting for previous unswitches that already happened on this
2812+
/// of loop-unswitch. Cost is multipied in proportion of 2^number of unswitch
2813+
/// candidates available. Also accounting for the number of "sibling" loops with
2814+
/// the idea to account for previous unswitches that already happened on this
28172815
/// cluster of loops. There was an attempt to keep this formula simple,
28182816
/// just enough to limit the worst case behavior. Even if it is not that simple
28192817
/// now it is still not an attempt to provide a detailed heuristic size
@@ -3509,9 +3507,8 @@ static bool unswitchBestCondition(Loop &L, DominatorTree &DT, LoopInfo &LI,
35093507
SmallVector<NonTrivialUnswitchCandidate, 4> UnswitchCandidates;
35103508
IVConditionInfo PartialIVInfo;
35113509
Instruction *PartialIVCondBranch = nullptr;
3512-
if (!findOptionMDForLoop(&L, "llvm.loop.unswitch.nontrivial.disable"))
3513-
collectUnswitchCandidates(UnswitchCandidates, PartialIVInfo,
3514-
PartialIVCondBranch, L, LI, AA, MSSAU);
3510+
collectUnswitchCandidates(UnswitchCandidates, PartialIVInfo,
3511+
PartialIVCondBranch, L, LI, AA, MSSAU);
35153512
if (!findOptionMDForLoop(&L, "llvm.loop.unswitch.injection.disable"))
35163513
collectUnswitchCandidatesWithInjections(UnswitchCandidates, PartialIVInfo,
35173514
PartialIVCondBranch, L, DT, LI, AA,

llvm/test/Transforms/LICM/PR116813-memoryssa-outdated.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ define i32 @foo(i1 %arg, ptr %arg1) {
1818
; CHECK: [[BB1]]:
1919
; CHECK-NEXT: [[UNSWITCHED_SELECT_US:%.*]] = phi ptr [ [[ARG1]], %[[BB0]] ]
2020
; CHECK-NEXT: [[I3_US:%.*]] = call i32 [[UNSWITCHED_SELECT_US]]()
21-
; CHECK-NEXT: br i1 true, label %[[LOOP_US]], label %[[RET_SPLIT_US:.*]], !llvm.loop [[LOOP0:![0-9]+]]
21+
; CHECK-NEXT: br i1 true, label %[[LOOP_US]], label %[[RET_SPLIT_US:.*]]
2222
; CHECK: [[RET_SPLIT_US]]:
2323
; CHECK-NEXT: [[I3_LCSSA_US:%.*]] = phi i32 [ [[I3_US]], %[[BB1]] ]
2424
; CHECK-NEXT: br label %[[RET:.*]]

llvm/test/Transforms/PhaseOrdering/AArch64/block_scaling_decompr_8bit.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ define dso_local noundef i32 @_Z33block_scaling_decompr_8bitjPK27compressed_data
9494
; CHECK-NEXT: [[DST_ADDR_1]] = getelementptr inbounds nuw i8, ptr [[DST_ADDR_052]], i64 48
9595
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
9696
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT58]]
97-
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END]], label %[[FOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
97+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END]], label %[[FOR_BODY]], !llvm.loop [[LOOP4]]
9898
; CHECK: [[FOR_END]]:
9999
; CHECK-NEXT: ret i32 0
100100
;
@@ -801,8 +801,6 @@ attributes #2 = { nocallback nofree nosync nounwind willreturn memory(none) }
801801
!4 = distinct !{!4, !5}
802802
!5 = !{!"llvm.loop.mustprogress"}
803803
;.
804-
; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META5:![0-9]+]], [[META6:![0-9]+]]}
804+
; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META5:![0-9]+]]}
805805
; CHECK: [[META5]] = !{!"llvm.loop.mustprogress"}
806-
; CHECK: [[META6]] = !{!"llvm.loop.unswitch.nontrivial.disable"}
807-
; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[META5]]}
808806
;.

llvm/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch-nested.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
;
4646
; RUN: opt < %s -enable-unswitch-cost-multiplier=false \
4747
; RUN: -passes='loop-mssa(licm,simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | \
48-
; RUN: sort -b -k 1 | FileCheck %s --check-prefixes=LOOP6
48+
; RUN: sort -b -k 1 | FileCheck %s --check-prefixes=LOOP32
4949
;
5050
; Single loop nest, not unswitched
5151
; LOOP1: Loop at depth 1 containing:
@@ -55,23 +55,23 @@
5555
;
5656
; Half unswitched loop nests, with unscaled4 and div1 it gets less depth1 loops unswitched
5757
; since they have more cost.
58-
; LOOP-UNSCALE4-DIV1-COUNT-4: Loop at depth 1 containing:
59-
; LOOP-UNSCALE4-DIV1-COUNT-4: Loop at depth 2 containing:
60-
; LOOP-UNSCALE4-DIV1-COUNT-4: Loop at depth 3 containing:
58+
; LOOP-UNSCALE4-DIV1-COUNT-6: Loop at depth 1 containing:
59+
; LOOP-UNSCALE4-DIV1-COUNT-19: Loop at depth 2 containing:
60+
; LOOP-UNSCALE4-DIV1-COUNT-29: Loop at depth 3 containing:
6161
; LOOP-UNSCALE4-DIV1-NOT: Loop at depth {{[0-9]+}} containing:
6262
;
6363
; Half unswitched loop nests, with unscaled4 and div2 it gets more depth1 loops unswitched
6464
; as div2 kicks in.
65-
; LOOP-UNSCALE4-DIV2-COUNT-4: Loop at depth 1 containing:
66-
; LOOP-UNSCALE4-DIV2-COUNT-4: Loop at depth 2 containing:
67-
; LOOP-UNSCALE4-DIV2-COUNT-4: Loop at depth 3 containing:
65+
; LOOP-UNSCALE4-DIV2-COUNT-11: Loop at depth 1 containing:
66+
; LOOP-UNSCALE4-DIV2-COUNT-22: Loop at depth 2 containing:
67+
; LOOP-UNSCALE4-DIV2-COUNT-29: Loop at depth 3 containing:
6868
; LOOP-UNSCALE4-DIV2-NOT: Loop at depth {{[0-9]+}} containing:
6969
;
70-
; 6 loop nests, fully unswitched
71-
; LOOP6-COUNT-6: Loop at depth 1 containing:
72-
; LOOP6-COUNT-6: Loop at depth 2 containing:
73-
; LOOP6-COUNT-6: Loop at depth 3 containing:
74-
; LOOP6-NOT: Loop at depth {{[0-9]+}} containing:
70+
; 32 loop nests, fully unswitched
71+
; LOOP32-COUNT-32: Loop at depth 1 containing:
72+
; LOOP32-COUNT-32: Loop at depth 2 containing:
73+
; LOOP32-COUNT-32: Loop at depth 3 containing:
74+
; LOOP32-NOT: Loop at depth {{[0-9]+}} containing:
7575

7676
declare void @bar()
7777

llvm/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch-nested2.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
;
6161
; Half unswitched loop nests, with unscaled3 and div1 it gets less depth1 loops unswitched
6262
; since they have more cost.
63-
; LOOP-UNSCALE3-DIV1-COUNT-2: Loop at depth 1 containing:
63+
; LOOP-UNSCALE3-DIV1-COUNT-4: Loop at depth 1 containing:
6464
; LOOP-UNSCALE3-DIV1-NOT: Loop at depth 1 containing:
6565
; LOOP-UNSCALE3-DIV1-COUNT-1: Loop at depth 2 containing:
6666
; LOOP-UNSCALE3-DIV1-NOT: Loop at depth 2 containing:
@@ -69,15 +69,15 @@
6969
;
7070
; Half unswitched loop nests, with unscaled3 and div2 it gets more depth1 loops unswitched
7171
; as div2 kicks in.
72-
; LOOP-UNSCALE3-DIV2-COUNT-2: Loop at depth 1 containing:
72+
; LOOP-UNSCALE3-DIV2-COUNT-6: Loop at depth 1 containing:
7373
; LOOP-UNSCALE3-DIV2-NOT: Loop at depth 1 containing:
7474
; LOOP-UNSCALE3-DIV2-COUNT-1: Loop at depth 2 containing:
7575
; LOOP-UNSCALE3-DIV2-NOT: Loop at depth 2 containing:
7676
; LOOP-UNSCALE3-DIV2-COUNT-1: Loop at depth 3 containing:
7777
; LOOP-UNSCALE3-DIV2-NOT: Loop at depth 3 containing:
7878
;
7979
; Maximally unswitched (copy of the outer loop per each condition)
80-
; LOOP-MAX-COUNT-2: Loop at depth 1 containing:
80+
; LOOP-MAX-COUNT-6: Loop at depth 1 containing:
8181
; LOOP-MAX-NOT: Loop at depth 1 containing:
8282
; LOOP-MAX-COUNT-1: Loop at depth 2 containing:
8383
; LOOP-MAX-NOT: Loop at depth 2 containing:

llvm/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch.ll

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,37 +25,46 @@
2525
;
2626
; RUN: opt < %s -enable-unswitch-cost-multiplier=true \
2727
; RUN: -unswitch-num-initial-unscaled-candidates=8 -unswitch-siblings-toplevel-div=1 \
28-
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP4
28+
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP5
2929
;
3030
; RUN: opt < %s -enable-unswitch-cost-multiplier=true \
3131
; RUN: -unswitch-num-initial-unscaled-candidates=8 -unswitch-siblings-toplevel-div=1 \
32-
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP4
32+
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP5
33+
;
34+
; With relaxed candidates multiplier (unscaled candidates == 8) and with relaxed
35+
; siblings multiplier for top-level loops (toplevel-div == 8) we should get
36+
; 2^(num conds) == 2^5 == 32
37+
; copies of the loop:
3338
;
3439
; RUN: opt < %s -enable-unswitch-cost-multiplier=true \
3540
; RUN: -unswitch-num-initial-unscaled-candidates=8 -unswitch-siblings-toplevel-div=8 \
36-
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP6
41+
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP32
3742
;
3843
; RUN: opt < %s -enable-unswitch-cost-multiplier=true \
3944
; RUN: -unswitch-num-initial-unscaled-candidates=8 -unswitch-siblings-toplevel-div=8 \
40-
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP6
45+
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP32
46+
;
47+
; Similarly get
48+
; 2^(num conds) == 2^5 == 32
49+
; copies of the loop when cost multiplier is disabled:
4150
;
4251
; RUN: opt < %s -enable-unswitch-cost-multiplier=false \
43-
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP6
52+
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP32
4453
;
4554
; RUN: opt < %s -enable-unswitch-cost-multiplier=false \
46-
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP6
55+
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP32
4756
;
4857
; Single loop, not unswitched
4958
; LOOP1: Loop at depth 1 containing:
5059
; LOOP1-NOT: Loop at depth 1 containing:
5160

52-
; 4 loops, unswitched 4 times
53-
; LOOP4-COUNT-4: Loop at depth 1 containing:
54-
; LOOP4-NOT: Loop at depth 1 containing:
61+
; 5 loops, unswitched 4 times
62+
; LOOP5-COUNT-5: Loop at depth 1 containing:
63+
; LOOP5-NOT: Loop at depth 1 containing:
5564

56-
; 6 loops, fully unswitched
57-
; LOOP6-COUNT-6: Loop at depth 1 containing:
58-
; LOOP6-NOT: Loop at depth 1 containing:
65+
; 32 loops, fully unswitched
66+
; LOOP32-COUNT-32: Loop at depth 1 containing:
67+
; LOOP32-NOT: Loop at depth 1 containing:
5968

6069
define void @loop_simple5(ptr %addr, i1 %c1, i1 %c2, i1 %c3, i1 %c4, i1 %c5) {
6170
entry:

llvm/test/Transforms/SimpleLoopUnswitch/exponential-switch-unswitch.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,19 @@
6161
; Somewhat relaxed restrictions on candidates:
6262
; LOOP-RELAX-COUNT-5: Loop at depth 1 containing:
6363
; LOOP-RELAX-NOT: Loop at depth 1 containing:
64-
; LOOP-RELAX-COUNT-5: Loop at depth 2 containing:
64+
; LOOP-RELAX-COUNT-32: Loop at depth 2 containing:
6565
; LOOP-RELAX-NOT: Loop at depth 2 containing:
6666
;
6767
; Even more relaxed restrictions on candidates and siblings.
68-
; LOOP-RELAX2-COUNT-5: Loop at depth 1 containing:
68+
; LOOP-RELAX2-COUNT-11: Loop at depth 1 containing:
6969
; LOOP-RELAX2-NOT: Loop at depth 1 containing:
70-
; LOOP-RELAX2-COUNT-5: Loop at depth 2 containing:
70+
; LOOP-RELAX2-COUNT-40: Loop at depth 2 containing:
7171
; LOOP-RELAX-NOT: Loop at depth 2 containing:
7272
;
7373
; Unswitched as much as it could (with multiplier disabled).
74-
; LOOP-MAX-COUNT-6: Loop at depth 1 containing:
74+
; LOOP-MAX-COUNT-56: Loop at depth 1 containing:
7575
; LOOP-MAX-NOT: Loop at depth 1 containing:
76-
; LOOP-MAX-COUNT-11: Loop at depth 2 containing:
76+
; LOOP-MAX-COUNT-111: Loop at depth 2 containing:
7777
; LOOP-MAX-NOT: Loop at depth 2 containing:
7878

7979
define i32 @loop_switch(ptr %addr, i32 %c1, i32 %c2) {

llvm/test/Transforms/SimpleLoopUnswitch/guards.ll

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,25 @@ exit:
3838
}
3939

4040
define void @test_two_guards(i1 %cond1, i1 %cond2, i32 %N) {
41-
; CHECK-LABEL: define void @test_two_guards(i1 %cond1, i1 %cond2, i32 %N) {
41+
; CHECK-LABEL: @test_two_guards(
4242
; CHECK-NEXT: entry:
43-
; CHECK-NEXT: br i1 %cond1, label %entry.split.us, label %entry.split
43+
; CHECK-NEXT: br i1 [[COND1:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
4444
; CHECK: entry.split.us:
45-
; CHECK-NEXT: br label %loop.us
46-
; CHECK: loop.us:
47-
; CHECK-NEXT: %iv.us = phi i32 [ 0, %entry.split.us ], [ %iv.next.us, %guarded.us ]
48-
; CHECK-NEXT: br label %guarded.us
49-
; CHECK: guarded.us:
50-
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 %cond2) [ "deopt"() ]
51-
; CHECK-NEXT: %iv.next.us = add i32 %iv.us, 1
52-
; CHECK-NEXT: %loop.cond.us = icmp slt i32 %iv.next.us, %N
53-
; CHECK-NEXT: br i1 %loop.cond.us, label %loop.us, label %exit.split.us, !llvm.loop !2
54-
; CHECK: exit.split.us:
55-
; CHECK-NEXT: br label %exit
56-
; CHECK: entry.split:
57-
; CHECK-NEXT: br label %loop
58-
; CHECK: loop:
59-
; CHECK-NEXT: br label %deopt
45+
; CHECK-NEXT: br i1 [[COND2:%.*]], label [[ENTRY_SPLIT_US_SPLIT_US:%.*]], label [[ENTRY_SPLIT_US_SPLIT:%.*]]
46+
; CHECK: entry.split.us.split.us:
47+
; CHECK-NEXT: br label [[LOOP_US_US:%.*]]
48+
; CHECK: loop.us.us:
49+
; CHECK-NEXT: [[IV_US_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US_SPLIT_US]] ], [ [[IV_NEXT_US_US:%.*]], [[GUARDED_US2:%.*]] ]
50+
; CHECK-NEXT: br label [[GUARDED_US_US:%.*]]
51+
; CHECK: guarded.us.us:
52+
; CHECK-NEXT: br label [[GUARDED_US2]]
53+
; CHECK: guarded.us2:
54+
; CHECK-NEXT: [[IV_NEXT_US_US]] = add i32 [[IV_US_US]], 1
55+
; CHECK-NEXT: [[LOOP_COND_US_US:%.*]] = icmp slt i32 [[IV_NEXT_US_US]], [[N:%.*]]
56+
; CHECK-NEXT: br i1 [[LOOP_COND_US_US]], label [[LOOP_US_US]], label [[EXIT_SPLIT_US_SPLIT_US:%.*]]
57+
; CHECK: deopt1:
58+
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
59+
; CHECK-NEXT: unreachable
6060
; CHECK: deopt:
6161
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
6262
; CHECK-NEXT: unreachable

0 commit comments

Comments
 (0)