diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -1348,16 +1348,16 @@ // Computing the value outside of the loop brings no benefit if it is // definitely used inside the loop in a way which can not be optimized - // away. Avoid doing so unless we know we have a value which computes - // the ExitValue already. TODO: This should be merged into SCEV - // expander to leverage its knowledge of existing expressions. - if (ReplaceExitValue != AlwaysRepl && - !isa(ExitValue) && !isa(ExitValue) && + // away. Avoid doing so unless either we know we have a value + // which computes the ExitValue already, or it is cheap to do so. + // TODO: This should be merged into SCEV expander to leverage + // its knowledge of existing expressions. + bool HighCost = Rewriter.isHighCostExpansion( + ExitValue, L, SCEVCheapExpansionBudget, TTI, Inst); + if (ReplaceExitValue != AlwaysRepl && HighCost && hasHardUserWithinLoop(L, Inst)) continue; - bool HighCost = Rewriter.isHighCostExpansion( - ExitValue, L, SCEVCheapExpansionBudget, TTI, Inst); Value *ExitVal = Rewriter.expandCodeFor(ExitValue, PN->getType(), Inst); LLVM_DEBUG(dbgs() << "rewriteLoopExitValues: AfterLoopVal = " diff --git a/llvm/test/Transforms/IndVarSimplify/dont-recompute.ll b/llvm/test/Transforms/IndVarSimplify/dont-recompute.ll --- a/llvm/test/Transforms/IndVarSimplify/dont-recompute.ll +++ b/llvm/test/Transforms/IndVarSimplify/dont-recompute.ll @@ -35,8 +35,8 @@ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]] ; CHECK: for.end: -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] -; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]]) +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 +; CHECK-NEXT: tail call void @func(i32 [[TMP0]]) ; CHECK-NEXT: ret void ; entry: @@ -69,8 +69,8 @@ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]] ; CHECK: for.end: -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] -; CHECK-NEXT: ret i32 [[ADD_LCSSA]] +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 +; CHECK-NEXT: ret i32 [[TMP0]] ; entry: br label %for.body @@ -101,8 +101,8 @@ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]] ; CHECK: for.end: -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] -; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]]) +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 +; CHECK-NEXT: tail call void @func(i32 [[TMP0]]) ; CHECK-NEXT: ret void ; entry: @@ -141,8 +141,8 @@ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]] ; CHECK: for.end: -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] -; CHECK-NEXT: [[SOFT_USE:%.*]] = add i32 [[ADD_LCSSA]], 123 +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 +; CHECK-NEXT: [[SOFT_USE:%.*]] = add i32 [[TMP0]], 123 ; CHECK-NEXT: tail call void @func(i32 [[SOFT_USE]]) ; CHECK-NEXT: ret void ; @@ -178,8 +178,8 @@ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]] ; CHECK: for.end: -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] -; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]]) +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 +; CHECK-NEXT: tail call void @func(i32 [[TMP0]]) ; CHECK-NEXT: ret void ; entry: @@ -215,8 +215,8 @@ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]] ; CHECK: for.end: -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] -; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]]) +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 +; CHECK-NEXT: tail call void @func(i32 [[TMP0]]) ; CHECK-NEXT: ret void ; entry: diff --git a/llvm/test/Transforms/IndVarSimplify/elim-extend.ll b/llvm/test/Transforms/IndVarSimplify/elim-extend.ll --- a/llvm/test/Transforms/IndVarSimplify/elim-extend.ll +++ b/llvm/test/Transforms/IndVarSimplify/elim-extend.ll @@ -143,8 +143,7 @@ ; CHECK-NEXT: [[INNERCMP:%.*]] = icmp sgt i64 [[TMP0]], [[INDVARS_IV_NEXT]] ; CHECK-NEXT: br i1 [[INNERCMP]], label [[INNERLOOP]], label [[INNEREXIT:%.*]] ; CHECK: innerexit: -; CHECK-NEXT: [[INNERCOUNT_LCSSA_WIDE:%.*]] = phi i64 [ [[INDVARS_IV_NEXT]], [[INNERLOOP]] ] -; CHECK-NEXT: [[TMP4:%.*]] = trunc i64 [[INNERCOUNT_LCSSA_WIDE]] to i32 +; CHECK-NEXT: [[TMP4:%.*]] = trunc i64 [[TMP0]] to i32 ; CHECK-NEXT: br label [[OUTERMERGE]] ; CHECK: outermerge: ; CHECK-NEXT: [[INNERCOUNT_MERGE]] = phi i32 [ [[TMP4]], [[INNEREXIT]] ], [ [[INNERCOUNT]], [[INNERPREHEADER]] ] diff --git a/llvm/test/Transforms/IndVarSimplify/lrev-existing-umin.ll b/llvm/test/Transforms/IndVarSimplify/lrev-existing-umin.ll --- a/llvm/test/Transforms/IndVarSimplify/lrev-existing-umin.ll +++ b/llvm/test/Transforms/IndVarSimplify/lrev-existing-umin.ll @@ -26,8 +26,7 @@ ; CHECK-NEXT: [[TMP23:%.*]] = icmp slt i32 [[TMP22]], [[TMP14]] ; CHECK-NEXT: br i1 [[TMP23]], label [[NOT_ZERO11]], label [[MAIN_EXIT_SELECTOR:%.*]] ; CHECK: main.exit.selector: -; CHECK-NEXT: [[TMP22_LCSSA:%.*]] = phi i32 [ [[TMP22]], [[NOT_ZERO11]] ] -; CHECK-NEXT: [[TMP24:%.*]] = icmp slt i32 [[TMP22_LCSSA]], [[LENGTH_I]] +; CHECK-NEXT: [[TMP24:%.*]] = icmp slt i32 [[TMP14]], [[LENGTH_I]] ; CHECK-NEXT: br i1 [[TMP24]], label [[NOT_ZERO11_POSTLOOP]], label [[LEAVE:%.*]] ; CHECK: leave: ; CHECK-NEXT: ret void diff --git a/llvm/test/Transforms/IndVarSimplify/pr28705.ll b/llvm/test/Transforms/IndVarSimplify/pr28705.ll --- a/llvm/test/Transforms/IndVarSimplify/pr28705.ll +++ b/llvm/test/Transforms/IndVarSimplify/pr28705.ll @@ -16,14 +16,14 @@ ; CHECK: for.body650.lr.ph: ; CHECK-NEXT: br label [[FOR_BODY650:%.*]] ; CHECK: loopexit: -; CHECK-NEXT: [[INC_I_I_LCSSA:%.*]] = phi i32 [ [[INC_I_I:%.*]], [[FOR_BODY650]] ] +; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[DOTSROA_SPECULATED]], 1 ; CHECK-NEXT: br label [[XZ_EXIT]] ; CHECK: XZ.exit: -; CHECK-NEXT: [[DB_SROA_9_0_LCSSA:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[INC_I_I_LCSSA]], [[LOOPEXIT:%.*]] ] +; CHECK-NEXT: [[DB_SROA_9_0_LCSSA:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[TMP0]], [[LOOPEXIT:%.*]] ] ; CHECK-NEXT: br label [[END:%.*]] ; CHECK: for.body650: ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[FOR_BODY650_LR_PH]] ], [ [[INC655:%.*]], [[FOR_BODY650]] ] -; CHECK-NEXT: [[IV2:%.*]] = phi i32 [ 1, [[FOR_BODY650_LR_PH]] ], [ [[INC_I_I]], [[FOR_BODY650]] ] +; CHECK-NEXT: [[IV2:%.*]] = phi i32 [ 1, [[FOR_BODY650_LR_PH]] ], [ [[INC_I_I:%.*]], [[FOR_BODY650]] ] ; CHECK-NEXT: [[ARRAYIDX_I_I1105:%.*]] = getelementptr inbounds i8, i8* [[REF_I1174:%.*]], i32 [[IV2]] ; CHECK-NEXT: store i8 7, i8* [[ARRAYIDX_I_I1105]], align 1 ; CHECK-NEXT: [[INC_I_I]] = add nuw nsw i32 [[IV2]], 1 diff --git a/llvm/test/Transforms/IndVarSimplify/pr39673.ll b/llvm/test/Transforms/IndVarSimplify/pr39673.ll --- a/llvm/test/Transforms/IndVarSimplify/pr39673.ll +++ b/llvm/test/Transforms/IndVarSimplify/pr39673.ll @@ -72,8 +72,8 @@ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i16 [[L2_ADD]], 2 ; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP2]], label [[LOOP2_END:%.*]] ; CHECK: loop2.end: -; CHECK-NEXT: [[K2_ADD_LCSSA:%.*]] = phi i16 [ [[K2_ADD]], [[LOOP2]] ] -; CHECK-NEXT: ret i16 [[K2_ADD_LCSSA]] +; CHECK-NEXT: [[TMP0:%.*]] = add i16 [[ARG2]], 2 +; CHECK-NEXT: ret i16 [[TMP0]] ; entry: br label %loop1 @@ -121,8 +121,8 @@ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i16 [[L2_ADD]], 2 ; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP2]], label [[LOOP2_END:%.*]] ; CHECK: loop2.end: -; CHECK-NEXT: [[K2_ADD_LCSSA:%.*]] = phi i16 [ [[K2_ADD]], [[LOOP2]] ] -; CHECK-NEXT: ret i16 [[K2_ADD_LCSSA]] +; CHECK-NEXT: [[TMP0:%.*]] = add i16 [[DUMMY]], 2 +; CHECK-NEXT: ret i16 [[TMP0]] ; entry: br label %loop2.preheader @@ -166,8 +166,8 @@ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i16 [[L2_ADD]], 2 ; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP2]], label [[LOOP2_END:%.*]] ; CHECK: loop2.end: -; CHECK-NEXT: [[K2_ADD_LCSSA:%.*]] = phi i16 [ [[K2_ADD]], [[LOOP2]] ] -; CHECK-NEXT: ret i16 [[K2_ADD_LCSSA]] +; CHECK-NEXT: [[TMP1:%.*]] = add i16 [[TMP0]], 2 +; CHECK-NEXT: ret i16 [[TMP1]] ; entry: br label %loop1