Skip to content

Commit e9de32f

Browse files
[SimpleLoopUnswitch] Record loops from unswitching non-trivial conditions
Track newly-cloned loops coming from unswitching non-trivial invariant conditions, so as to prevent conditions in such cloned blocks from being unswitched again. Fixes: #138509.
1 parent 531cf82 commit e9de32f

17 files changed

+412
-528
lines changed

llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2144,34 +2144,36 @@ 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-
// If we did a non-trivial unswitch, we have added new (cloned) loops.
2148-
if (!NewLoops.empty())
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");
21492162
U.addSiblingLoops(NewLoops);
2163+
}
21502164

21512165
// If the current loop remains valid, we should revisit it to catch any
21522166
// other unswitch opportunities. Otherwise, we need to mark it as deleted.
21532167
if (CurrentLoopValid) {
21542168
if (PartiallyInvariant) {
21552169
// Mark the new loop as partially unswitched, to avoid unswitching on
21562170
// the same condition again.
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);
2171+
RecordLoopAsUnswitched(&L, "llvm.loop.unswitch.partial",
2172+
"llvm.loop.unswitch.partial.disable");
21652173
} else if (InjectedCondition) {
21662174
// Do the same for injection of invariant conditions.
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);
2175+
RecordLoopAsUnswitched(&L, "llvm.loop.unswitch.injection",
2176+
"llvm.loop.unswitch.injection.disable");
21752177
} else
21762178
U.revisitCurrentLoop();
21772179
} else
@@ -2809,9 +2811,9 @@ static BranchInst *turnGuardIntoBranch(IntrinsicInst *GI, Loop &L,
28092811
}
28102812

28112813
/// Cost multiplier is a way to limit potentially exponential behavior
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
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
28152817
/// cluster of loops. There was an attempt to keep this formula simple,
28162818
/// just enough to limit the worst case behavior. Even if it is not that simple
28172819
/// now it is still not an attempt to provide a detailed heuristic size
@@ -3507,8 +3509,9 @@ static bool unswitchBestCondition(Loop &L, DominatorTree &DT, LoopInfo &LI,
35073509
SmallVector<NonTrivialUnswitchCandidate, 4> UnswitchCandidates;
35083510
IVConditionInfo PartialIVInfo;
35093511
Instruction *PartialIVCondBranch = nullptr;
3510-
collectUnswitchCandidates(UnswitchCandidates, PartialIVInfo,
3511-
PartialIVCondBranch, L, LI, AA, MSSAU);
3512+
if (!findOptionMDForLoop(&L, "llvm.loop.unswitch.nontrivial.disable"))
3513+
collectUnswitchCandidates(UnswitchCandidates, PartialIVInfo,
3514+
PartialIVCondBranch, L, LI, AA, MSSAU);
35123515
if (!findOptionMDForLoop(&L, "llvm.loop.unswitch.injection.disable"))
35133516
collectUnswitchCandidatesWithInjections(UnswitchCandidates, PartialIVInfo,
35143517
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:.*]]
21+
; CHECK-NEXT: br i1 true, label %[[LOOP_US]], label %[[RET_SPLIT_US:.*]], !llvm.loop [[LOOP0:![0-9]+]]
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: 4 additions & 2 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 [[LOOP4]]
97+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_END]], label %[[FOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
9898
; CHECK: [[FOR_END]]:
9999
; CHECK-NEXT: ret i32 0
100100
;
@@ -801,6 +801,8 @@ 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]+]]}
804+
; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META5:![0-9]+]], [[META6:![0-9]+]]}
805805
; CHECK: [[META5]] = !{!"llvm.loop.mustprogress"}
806+
; CHECK: [[META6]] = !{!"llvm.loop.unswitch.nontrivial.disable"}
807+
; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[META5]]}
806808
;.

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=LOOP32
48+
; RUN: sort -b -k 1 | FileCheck %s --check-prefixes=LOOP6
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-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:
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:
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-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:
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:
6868
; LOOP-UNSCALE4-DIV2-NOT: Loop at depth {{[0-9]+}} containing:
6969
;
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:
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:
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-4: Loop at depth 1 containing:
63+
; LOOP-UNSCALE3-DIV1-COUNT-2: 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-6: Loop at depth 1 containing:
72+
; LOOP-UNSCALE3-DIV2-COUNT-2: 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-6: Loop at depth 1 containing:
80+
; LOOP-MAX-COUNT-2: 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: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,46 +25,37 @@
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=LOOP5
28+
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP4
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=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:
32+
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP4
3833
;
3934
; RUN: opt < %s -enable-unswitch-cost-multiplier=true \
4035
; RUN: -unswitch-num-initial-unscaled-candidates=8 -unswitch-siblings-toplevel-div=8 \
41-
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP32
36+
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP6
4237
;
4338
; RUN: opt < %s -enable-unswitch-cost-multiplier=true \
4439
; RUN: -unswitch-num-initial-unscaled-candidates=8 -unswitch-siblings-toplevel-div=8 \
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:
40+
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP6
5041
;
5142
; RUN: opt < %s -enable-unswitch-cost-multiplier=false \
52-
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP32
43+
; RUN: -passes='loop(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP6
5344
;
5445
; RUN: opt < %s -enable-unswitch-cost-multiplier=false \
55-
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP32
46+
; RUN: -passes='loop-mssa(simple-loop-unswitch<nontrivial>),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP6
5647
;
5748
; Single loop, not unswitched
5849
; LOOP1: Loop at depth 1 containing:
5950
; LOOP1-NOT: Loop at depth 1 containing:
6051

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

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

6960
define void @loop_simple5(ptr %addr, i1 %c1, i1 %c2, i1 %c3, i1 %c4, i1 %c5) {
7061
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-32: Loop at depth 2 containing:
64+
; LOOP-RELAX-COUNT-5: 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-11: Loop at depth 1 containing:
68+
; LOOP-RELAX2-COUNT-5: Loop at depth 1 containing:
6969
; LOOP-RELAX2-NOT: Loop at depth 1 containing:
70-
; LOOP-RELAX2-COUNT-40: Loop at depth 2 containing:
70+
; LOOP-RELAX2-COUNT-5: 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-56: Loop at depth 1 containing:
74+
; LOOP-MAX-COUNT-6: Loop at depth 1 containing:
7575
; LOOP-MAX-NOT: Loop at depth 1 containing:
76-
; LOOP-MAX-COUNT-111: Loop at depth 2 containing:
76+
; LOOP-MAX-COUNT-11: 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: @test_two_guards(
41+
; CHECK-LABEL: define void @test_two_guards(i1 %cond1, i1 %cond2, i32 %N) {
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 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
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
6060
; CHECK: deopt:
6161
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
6262
; CHECK-NEXT: unreachable

0 commit comments

Comments
 (0)