Pull in r322473 from upstream llvm trunk (by Andrei Elovikov):
[LV] Don't call recordVectorLoopValueForInductionCast for newly-created IV from a trunc. Summary: This method is supposed to be called for IVs that have casts in their use-def chains that are completely ignored after vectorization under PSE. However, for truncates of such IVs the same InductionDescriptor is used during creation/widening of both original IV based on PHINode and new IV based on TruncInst. This leads to unintended second call to recordVectorLoopValueForInductionCast with a VectorLoopVal set to the newly created IV for a trunc and causes an assert due to attempt to store new information for already existing entry in the map. This is wrong and should not be done. Fixes PR35773. Reviewers: dorit, Ayal, mssimpso Reviewed By: dorit Subscribers: RKSimon, dim, dcaballe, hsaito, llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D41913 This should fix "Vector value already set for part" assertions when building the net/iodine and sysutils/daa2iso ports. Reported by: jbeich PR: 224867,224868
This commit is contained in:
parent
67a3bb4e34
commit
a7264ff541
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=328010
@ -2630,9 +2630,12 @@ void InnerLoopVectorizer::createVectorIntOrFpInductionPHI(
|
||||
Instruction *LastInduction = VecInd;
|
||||
for (unsigned Part = 0; Part < UF; ++Part) {
|
||||
VectorLoopValueMap.setVectorValue(EntryVal, Part, LastInduction);
|
||||
recordVectorLoopValueForInductionCast(II, LastInduction, Part);
|
||||
|
||||
if (isa<TruncInst>(EntryVal))
|
||||
addMetadata(LastInduction, EntryVal);
|
||||
else
|
||||
recordVectorLoopValueForInductionCast(II, LastInduction, Part);
|
||||
|
||||
LastInduction = cast<Instruction>(addFastMathFlag(
|
||||
Builder.CreateBinOp(AddOp, LastInduction, SplatVF, "step.add")));
|
||||
}
|
||||
@ -2754,15 +2757,17 @@ void InnerLoopVectorizer::widenIntOrFpInduction(PHINode *IV, TruncInst *Trunc) {
|
||||
|
||||
// If we haven't yet vectorized the induction variable, splat the scalar
|
||||
// induction variable, and build the necessary step vectors.
|
||||
// TODO: Don't do it unless the vectorized IV is really required.
|
||||
if (!VectorizedIV) {
|
||||
Value *Broadcasted = getBroadcastInstrs(ScalarIV);
|
||||
for (unsigned Part = 0; Part < UF; ++Part) {
|
||||
Value *EntryPart =
|
||||
getStepVector(Broadcasted, VF * Part, Step, ID.getInductionOpcode());
|
||||
VectorLoopValueMap.setVectorValue(EntryVal, Part, EntryPart);
|
||||
recordVectorLoopValueForInductionCast(ID, EntryPart, Part);
|
||||
if (Trunc)
|
||||
addMetadata(EntryPart, Trunc);
|
||||
else
|
||||
recordVectorLoopValueForInductionCast(ID, EntryPart, Part);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user