Index: llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -42,7 +42,7 @@ #define DEBUG_TYPE "loop-simplifycfg" static cl::opt EnableTermFolding("enable-loop-simplifycfg-term-folding", - cl::init(false)); + cl::init(true)); STATISTIC(NumTerminatorsFolded, "Number of terminators folded to unconditional branches"); @@ -83,6 +83,7 @@ Loop &L; LoopInfo &LI; DominatorTree &DT; + MemorySSAUpdater *MSSAU; // Whether or not the current loop will still exist after terminator constant // folding will be done. In theory, there are two ways how it can happen: @@ -257,6 +258,8 @@ // the one-input Phi because it is a LCSSA Phi. bool PreserveLCSSAPhi = !L.contains(Succ); Succ->removePredecessor(BB, PreserveLCSSAPhi); + if (MSSAU) + MSSAU->removeEdge(BB, Succ); } else ++TheOnlySuccDuplicates; @@ -267,6 +270,8 @@ bool PreserveLCSSAPhi = !L.contains(TheOnlySucc); for (unsigned Dup = 1; Dup < TheOnlySuccDuplicates; ++Dup) TheOnlySucc->removePredecessor(BB, PreserveLCSSAPhi); + if (MSSAU && TheOnlySuccDuplicates > 1) + MSSAU->removeDuplicatePhiEdgesBetween(BB, TheOnlySucc); IRBuilder<> Builder(BB->getContext()); Instruction *Term = BB->getTerminator(); @@ -282,8 +287,9 @@ } public: - ConstantTerminatorFoldingImpl(Loop &L, LoopInfo &LI, DominatorTree &DT) - : L(L), LI(LI), DT(DT) {} + ConstantTerminatorFoldingImpl(Loop &L, LoopInfo &LI, DominatorTree &DT, + MemorySSAUpdater *MSSAU) + : L(L), LI(LI), DT(DT), MSSAU(MSSAU) {} bool run() { assert(L.getLoopLatch() && "Should be single latch!"); @@ -364,7 +370,8 @@ /// Turn branches and switches with known constant conditions into unconditional /// branches. -static bool constantFoldTerminators(Loop &L, DominatorTree &DT, LoopInfo &LI) { +static bool constantFoldTerminators(Loop &L, DominatorTree &DT, LoopInfo &LI, + MemorySSAUpdater *MSSAU) { if (!EnableTermFolding) return false; @@ -373,7 +380,7 @@ if (!L.getLoopLatch()) return false; - ConstantTerminatorFoldingImpl BranchFolder(L, LI, DT); + ConstantTerminatorFoldingImpl BranchFolder(L, LI, DT, MSSAU); return BranchFolder.run(); } @@ -410,7 +417,7 @@ bool Changed = false; // Constant-fold terminators with known constant conditions. - Changed |= constantFoldTerminators(L, DT, LI); + Changed |= constantFoldTerminators(L, DT, LI, MSSAU); // Eliminate unconditional branches by merging blocks into their predecessors. Changed |= mergeBlocksIntoPredecessors(L, DT, LI, MSSAU); Index: llvm/trunk/test/Transforms/LoopSimplifyCFG/pr39783.ll =================================================================== --- llvm/trunk/test/Transforms/LoopSimplifyCFG/pr39783.ll +++ llvm/trunk/test/Transforms/LoopSimplifyCFG/pr39783.ll @@ -1,4 +1,3 @@ -; XFAIL: * ; REQUIRES: asserts ; RUN: opt -march=z13 -S -loop-simplifycfg -enable-mssa-loop-dependency -enable-loop-simplifycfg-term-folding 2>&1 < %s | FileCheck %s target datalayout = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"