Skip to content

Commit f275d2b

Browse files
authored
[DFAJumpThreading] Don't insert existing edge to DomTree while unfolding (#163296)
The edge `StartBlock -> EndBlock` already exists before unfolding. The instructions for `applyUpdates()` say that you are supposed not to insert an existing edge. Fixes issues reported by @mikaelholmen in #162802
1 parent 3b93af5 commit f275d2b

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,7 @@ void DFAJumpThreading::unfold(DomTreeUpdater *DTU, LoopInfo *LI,
266266
if (!ProfcheckDisableMetadataFixes)
267267
BI->setMetadata(LLVMContext::MD_prof,
268268
SI->getMetadata(LLVMContext::MD_prof));
269-
DTU->applyUpdates({{DominatorTree::Insert, StartBlock, EndBlock},
270-
{DominatorTree::Insert, StartBlock, NewBlock}});
269+
DTU->applyUpdates({{DominatorTree::Insert, StartBlock, NewBlock}});
271270
} else {
272271
BasicBlock *EndBlock = SIUse->getParent();
273272
BasicBlock *NewBlockT = BasicBlock::Create(

llvm/test/Transforms/DFAJumpThreading/dfa-jump-threading-transform.ll

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,9 +445,67 @@ bb2: ; preds = %select.unfold
445445
unreachable
446446
}
447447

448+
449+
define i16 @DTU_update_crash() {
450+
; CHECK-LABEL: @DTU_update_crash(
451+
; CHECK-NEXT: entry:
452+
; CHECK-NEXT: br label [[FOR_BODY_SELECTBLOCK:%.*]]
453+
; CHECK: for.body.selectblock:
454+
; CHECK-NEXT: br i1 false, label [[SWITCHBLOCK_JT0:%.*]], label [[SEL_SI_UNFOLD_FALSE_JT0:%.*]]
455+
; CHECK: sel.si.unfold.false:
456+
; CHECK-NEXT: br label [[SWITCHBLOCK:%.*]]
457+
; CHECK: sel.si.unfold.false.jt0:
458+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ 0, [[FOR_BODY_SELECTBLOCK]] ]
459+
; CHECK-NEXT: br label [[SWITCHBLOCK_JT0]]
460+
; CHECK: switchblock:
461+
; CHECK-NEXT: [[SWITCHBLOCK_PHI:%.*]] = phi i32 [ poison, [[SEL_SI_UNFOLD_FALSE:%.*]] ]
462+
; CHECK-NEXT: [[P_24_ADDR_3:%.*]] = phi i32 [ 0, [[SEL_SI_UNFOLD_FALSE]] ]
463+
; CHECK-NEXT: switch i32 [[SWITCHBLOCK_PHI]], label [[CLEANUP:%.*]] [
464+
; CHECK-NEXT: i32 0, label [[FOR_INC:%.*]]
465+
; CHECK-NEXT: i32 1, label [[CLEANUP]]
466+
; CHECK-NEXT: i32 5, label [[FOR_BODY_SELECTBLOCK]]
467+
; CHECK-NEXT: ]
468+
; CHECK: switchblock.jt0:
469+
; CHECK-NEXT: [[SWITCHBLOCK_PHI_JT0:%.*]] = phi i32 [ 0, [[FOR_BODY_SELECTBLOCK]] ], [ [[DOTSI_UNFOLD_PHI_JT0]], [[SEL_SI_UNFOLD_FALSE_JT0]] ]
470+
; CHECK-NEXT: [[P_24_ADDR_3_JT0:%.*]] = phi i32 [ 0, [[FOR_BODY_SELECTBLOCK]] ], [ 0, [[SEL_SI_UNFOLD_FALSE_JT0]] ]
471+
; CHECK-NEXT: br label [[FOR_INC]]
472+
; CHECK: for.inc:
473+
; CHECK-NEXT: br i1 false, label [[FOR_BODY_SELECTBLOCK]], label [[CLEANUP]]
474+
; CHECK: cleanup:
475+
; CHECK-NEXT: call void (...) @llvm.fake.use(i32 [[P_24_ADDR_3_JT0]])
476+
; CHECK-NEXT: ret i16 0
477+
;
478+
entry:
479+
br label %for.body.selectblock
480+
481+
for.body.selectblock: ; preds = %for.inc, %switchblock, %entry
482+
%sel = select i1 false, i32 0, i32 0
483+
br label %switchblock
484+
485+
switchblock: ; preds = %for.body.selectblock
486+
%switchblock.phi = phi i32 [ %sel, %for.body.selectblock ]
487+
%p_24.addr.3 = phi i32 [ 0, %for.body.selectblock ]
488+
switch i32 %switchblock.phi, label %cleanup [
489+
i32 0, label %for.inc
490+
i32 1, label %cleanup
491+
i32 5, label %for.body.selectblock
492+
]
493+
494+
for.inc: ; preds = %switchblock
495+
br i1 false, label %for.body.selectblock, label %cleanup
496+
497+
cleanup: ; preds = %for.inc, %switchblock, %switchblock
498+
call void (...) @llvm.fake.use(i32 %p_24.addr.3)
499+
ret i16 0
500+
}
501+
502+
declare void @llvm.fake.use(...)
503+
448504
!0 = !{!"function_entry_count", i32 10}
449505
!1 = !{!"branch_weights", i32 3, i32 5}
450506
;.
507+
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
508+
;.
451509
; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i32 10}
452510
; CHECK: [[PROF1]] = !{!"branch_weights", i32 3, i32 5}
453511
;.

0 commit comments

Comments
 (0)