Index: lib/Transforms/Vectorize/SLPVectorizer.cpp =================================================================== --- lib/Transforms/Vectorize/SLPVectorizer.cpp +++ lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -304,7 +304,8 @@ typedef SmallVector InstrList; typedef SmallPtrSet ValueSet; typedef SmallVector StoreList; - typedef MapVector> ExtraValueToDebugLocsMap; + typedef MapVector> + ExtraValueToDebugLocsMap; BoUpSLP(Function *Func, ScalarEvolution *Se, TargetTransformInfo *Tti, TargetLibraryInfo *TLi, AliasAnalysis *Aa, LoopInfo *Li, @@ -4444,7 +4445,7 @@ // The same extra argument may be used several time, so log each attempt // to use it. for (auto &Pair : ExtraArgs) - ExternallyUsedValues[Pair.second].push_back(Pair.first->getDebugLoc()); + ExternallyUsedValues[Pair.second].push_back(Pair.first); while (i < NumReducedVals - ReduxWidth + 1 && ReduxWidth > 2) { auto VL = makeArrayRef(&ReducedVals[i], ReduxWidth); V.buildTree(VL, ExternallyUsedValues, ReductionOps); @@ -4495,10 +4496,11 @@ assert(!Pair.second.empty() && "At least one DebugLoc must be inserted"); // Add each externally used value to the final reduction. - for (auto &DL : Pair.second) { - Builder.SetCurrentDebugLocation(DL); + for (auto *I : Pair.second) { + Builder.SetCurrentDebugLocation(I->getDebugLoc()); VectorizedTree = Builder.CreateBinOp(ReductionOpcode, VectorizedTree, Pair.first, "bin.extra"); + propagateIRFlags(VectorizedTree, I); } } // Update users. Index: test/Transforms/SLPVectorizer/X86/horizontal-list.ll =================================================================== --- test/Transforms/SLPVectorizer/X86/horizontal-list.ll +++ test/Transforms/SLPVectorizer/X86/horizontal-list.ll @@ -1679,8 +1679,8 @@ ; CHECK-NEXT: [[RDX_SHUF1:%.*]] = shufflevector <4 x i32> [[BIN_RDX]], <4 x i32> undef, <4 x i32> ; CHECK-NEXT: [[BIN_RDX2:%.*]] = add <4 x i32> [[BIN_RDX]], [[RDX_SHUF1]] ; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i32> [[BIN_RDX2]], i32 0 -; CHECK-NEXT: [[BIN_EXTRA:%.*]] = add i32 [[TMP12]], [[ARG]] -; CHECK-NEXT: [[BIN_EXTRA3:%.*]] = add i32 [[BIN_EXTRA]], [[TMP9]] +; CHECK-NEXT: [[BIN_EXTRA:%.*]] = add nuw i32 [[TMP12]], [[ARG]] +; CHECK-NEXT: [[BIN_EXTRA3:%.*]] = add nsw i32 [[BIN_EXTRA]], [[TMP9]] ; CHECK-NEXT: [[R5:%.*]] = add nsw i32 [[R4]], undef ; CHECK-NEXT: ret i32 [[BIN_EXTRA3]] ; @@ -1707,8 +1707,8 @@ ; THRESHOLD-NEXT: [[RDX_SHUF1:%.*]] = shufflevector <4 x i32> [[BIN_RDX]], <4 x i32> undef, <4 x i32> ; THRESHOLD-NEXT: [[BIN_RDX2:%.*]] = add <4 x i32> [[BIN_RDX]], [[RDX_SHUF1]] ; THRESHOLD-NEXT: [[TMP12:%.*]] = extractelement <4 x i32> [[BIN_RDX2]], i32 0 -; THRESHOLD-NEXT: [[BIN_EXTRA:%.*]] = add i32 [[TMP12]], [[ARG]] -; THRESHOLD-NEXT: [[BIN_EXTRA3:%.*]] = add i32 [[BIN_EXTRA]], [[TMP9]] +; THRESHOLD-NEXT: [[BIN_EXTRA:%.*]] = add nuw i32 [[TMP12]], [[ARG]] +; THRESHOLD-NEXT: [[BIN_EXTRA3:%.*]] = add nsw i32 [[BIN_EXTRA]], [[TMP9]] ; THRESHOLD-NEXT: [[R5:%.*]] = add nsw i32 [[R4]], undef ; THRESHOLD-NEXT: ret i32 [[BIN_EXTRA3]] ;