diff --git a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp index d84b07bd1457c..d420aa7a931a0 100644 --- a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp +++ b/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp @@ -1215,24 +1215,20 @@ void PromoteMem2Reg::RenamePass(BasicBlock *BB, BasicBlock *Pred, } // 'Recurse' to our successors. - succ_iterator I = succ_begin(BB), E = succ_end(BB); - if (I == E) - return; // Keep track of the successors so we don't visit the same successor twice SmallPtrSet VisitedSuccs; - // Handle the first successor after the rest, to mimic legacy behaviour. - // FIXME: Handle them in regular order. - VisitedSuccs.insert(*I); - ++I; - - for (; I != E; ++I) - if (VisitedSuccs.insert(*I).second) - Worklist.emplace_back(*I, BB, IncomingVals, IncomingLocs); - - Worklist.emplace_back(*succ_begin(BB), BB, std::move(IncomingVals), - std::move(IncomingLocs)); + for (BasicBlock *S : reverse(successors(BB))) + if (VisitedSuccs.insert(S).second) { + if (VisitedSuccs.size() > 1) { + // Let the first successor own allocated arrays, other will make a copy. + IncomingVals = Worklist.back().Values; + IncomingLocs = Worklist.back().Locations; + } + Worklist.emplace_back(S, BB, std::move(IncomingVals), + std::move(IncomingLocs)); + } } void llvm::PromoteMemToReg(ArrayRef Allocas, DominatorTree &DT, diff --git a/llvm/test/Transforms/InstCombine/2009-02-20-InstCombine-SROA.ll b/llvm/test/Transforms/InstCombine/2009-02-20-InstCombine-SROA.ll index b532c81556738..ef414885bf809 100644 --- a/llvm/test/Transforms/InstCombine/2009-02-20-InstCombine-SROA.ll +++ b/llvm/test/Transforms/InstCombine/2009-02-20-InstCombine-SROA.ll @@ -215,7 +215,7 @@ define ptr @_Z3fooRSt6vectorIiSaIiEE(ptr %X) { ; IC_SROA-NEXT: [[TMP27:%.*]] = getelementptr i8, ptr [[__FIRST_ADDR_I_I_SROA_0_0]], i32 4 ; IC_SROA-NEXT: br label [[BB18_I_I]] ; IC_SROA: bb18.i.i: -; IC_SROA-NEXT: [[__FIRST_ADDR_I_I_SROA_0_1:%.*]] = phi ptr [ [[TMP27]], [[BB17_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0_0]], [[BB13_I_I]] ] +; IC_SROA-NEXT: [[__FIRST_ADDR_I_I_SROA_0_1:%.*]] = phi ptr [ [[__FIRST_ADDR_I_I_SROA_0_0]], [[BB13_I_I]] ], [ [[TMP27]], [[BB17_I_I]] ] ; IC_SROA-NEXT: [[TMP28:%.*]] = load i32, ptr [[__FIRST_ADDR_I_I_SROA_0_1]], align 4 ; IC_SROA-NEXT: [[TMP29:%.*]] = icmp eq i32 [[TMP28]], 42 ; IC_SROA-NEXT: br i1 [[TMP29]], label [[BB20_I_I:%.*]], label [[BB21_I_I:%.*]] @@ -225,7 +225,7 @@ define ptr @_Z3fooRSt6vectorIiSaIiEE(ptr %X) { ; IC_SROA-NEXT: [[TMP30:%.*]] = getelementptr i8, ptr [[__FIRST_ADDR_I_I_SROA_0_1]], i32 4 ; IC_SROA-NEXT: br label [[BB22_I_I]] ; IC_SROA: bb22.i.i: -; IC_SROA-NEXT: [[__FIRST_ADDR_I_I_SROA_0_2:%.*]] = phi ptr [ [[TMP30]], [[BB21_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0_0]], [[BB13_I_I]] ] +; IC_SROA-NEXT: [[__FIRST_ADDR_I_I_SROA_0_2:%.*]] = phi ptr [ [[__FIRST_ADDR_I_I_SROA_0_0]], [[BB13_I_I]] ], [ [[TMP30]], [[BB21_I_I]] ] ; IC_SROA-NEXT: [[TMP31:%.*]] = load i32, ptr [[__FIRST_ADDR_I_I_SROA_0_2]], align 4 ; IC_SROA-NEXT: [[TMP32:%.*]] = icmp eq i32 [[TMP31]], 42 ; IC_SROA-NEXT: br i1 [[TMP32]], label [[BB24_I_I:%.*]], label [[BB25_I_I:%.*]] diff --git a/llvm/test/Transforms/SimplifyCFG/Hexagon/switch-to-lookup-table.ll b/llvm/test/Transforms/SimplifyCFG/Hexagon/switch-to-lookup-table.ll index 349a18148460f..a29c6a2fdd642 100644 --- a/llvm/test/Transforms/SimplifyCFG/Hexagon/switch-to-lookup-table.ll +++ b/llvm/test/Transforms/SimplifyCFG/Hexagon/switch-to-lookup-table.ll @@ -43,7 +43,7 @@ define i32 @foo(i32 %x) #0 section ".tcm_text" { ; DISABLE: sw.default: ; DISABLE-NEXT: br label [[RETURN]] ; DISABLE: return: -; DISABLE-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 19, [[SW_DEFAULT]] ], [ 33, [[SW_BB5]] ], [ 12, [[SW_BB4]] ], [ 22, [[SW_BB3]] ], [ 14, [[SW_BB2]] ], [ 20, [[SW_BB1]] ], [ 9, [[ENTRY:%.*]] ] +; DISABLE-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 19, [[SW_DEFAULT]] ], [ 20, [[SW_BB1]] ], [ 14, [[SW_BB2]] ], [ 22, [[SW_BB3]] ], [ 12, [[SW_BB4]] ], [ 33, [[SW_BB5]] ], [ 9, [[ENTRY:%.*]] ] ; DISABLE-NEXT: ret i32 [[RETVAL_0]] ; entry: