From: Roman Lebedev Date: Sat, 19 Dec 2020 16:12:30 +0000 (+0300) Subject: [SimplifyCFG] Teach SimplifyCondBranchToTwoReturns() to preserve DomTree, part 1 X-Git-Tag: llvmorg-13-init~2887 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b94520c9ee2ffdb15e8af2afa210e8eb76da9343;p=platform%2Fupstream%2Fllvm.git [SimplifyCFG] Teach SimplifyCondBranchToTwoReturns() to preserve DomTree, part 1 ... for the general case of returning a value. --- diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index fb28205..8ee7e57 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -2688,6 +2688,11 @@ bool SimplifyCFGOpt::SimplifyCondBranchToTwoReturns(BranchInst *BI, EraseTerminatorAndDCECond(BI); + if (DTU) { + DTU->applyUpdatesPermissive({{DominatorTree::Delete, BB, TrueSucc}, + {DominatorTree::Delete, BB, FalseSucc}}); + } + return true; } diff --git a/llvm/test/Transforms/LoopDeletion/simplify-then-delete.ll b/llvm/test/Transforms/LoopDeletion/simplify-then-delete.ll index 4278ef1..294f610 100644 --- a/llvm/test/Transforms/LoopDeletion/simplify-then-delete.ll +++ b/llvm/test/Transforms/LoopDeletion/simplify-then-delete.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -S -indvars -loop-deletion -simplifycfg | FileCheck %s +; RUN: opt < %s -S -indvars -loop-deletion -simplifycfg -simplifycfg-require-and-preserve-domtree=1 | FileCheck %s ; PR5794 ; Indvars and loop deletion should be able to eliminate all looping diff --git a/llvm/test/Transforms/SimplifyCFG/2008-09-08-MultiplePred.ll b/llvm/test/Transforms/SimplifyCFG/2008-09-08-MultiplePred.ll index 6b216f5..a2477f2 100644 --- a/llvm/test/Transforms/SimplifyCFG/2008-09-08-MultiplePred.ll +++ b/llvm/test/Transforms/SimplifyCFG/2008-09-08-MultiplePred.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -simplifycfg -disable-output +; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -disable-output ; PR 2777 @g_103 = common global i32 0 ; [#uses=1] diff --git a/llvm/test/Transforms/SimplifyCFG/merge-duplicate-conditional-ret-val.ll b/llvm/test/Transforms/SimplifyCFG/merge-duplicate-conditional-ret-val.ll new file mode 100644 index 0000000..55e02e9 --- /dev/null +++ b/llvm/test/Transforms/SimplifyCFG/merge-duplicate-conditional-ret-val.ll @@ -0,0 +1,21 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -simplifycfg-dup-ret -S | FileCheck %s + +declare void @bar() +declare void @baz() + +define i8 @foo(i1 %c, i8 %v0, i8 %v1) { +; CHECK-LABEL: @foo( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[C:%.*]], i8 [[V0:%.*]], i8 [[V1:%.*]] +; CHECK-NEXT: ret i8 [[SPEC_SELECT]] +; +entry: + br i1 %c, label %true, label %false + +true: + ret i8 %v0 + +false: + ret i8 %v1 +}