Apply fix for LLVM PR51957 (Miscompilation in Botan's SHA3)
Merge commit e27a6db5298f from llvm git (by Jameson Nash): Bad SLPVectorization shufflevector replacement, resulting in write to wrong memory location We see that it might otherwise do: %10 = getelementptr {}**, <2 x {}***> %9, <2 x i32> <i32 10, i32 4> %11 = bitcast <2 x {}***> %10 to <2 x i64*> ... %27 = extractelement <2 x i64*> %11, i32 0 %28 = bitcast i64* %27 to <2 x i64>* store <2 x i64> %22, <2 x i64>* %28, align 4, !tbaa !2 Which is an out-of-bounds store (the extractelement got offset 10 instead of offset 4 as intended). With the fix, we correctly generate extractelement for i32 1 and generate correct code. Differential Revision: https://reviews.llvm.org/D106613
This commit is contained in:
parent
a18c6161ef
commit
397a8ba053
@ -5430,8 +5430,11 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
||||
// The pointer operand uses an in-tree scalar so we add the new BitCast
|
||||
// to ExternalUses list to make sure that an extract will be generated
|
||||
// in the future.
|
||||
if (getTreeEntry(PO))
|
||||
ExternalUses.emplace_back(PO, cast<User>(VecPtr), 0);
|
||||
if (TreeEntry *Entry = getTreeEntry(PO)) {
|
||||
// Find which lane we need to extract.
|
||||
unsigned FoundLane = Entry->findLaneForValue(PO);
|
||||
ExternalUses.emplace_back(PO, cast<User>(VecPtr), FoundLane);
|
||||
}
|
||||
|
||||
NewLI = Builder.CreateAlignedLoad(VecTy, VecPtr, LI->getAlign());
|
||||
} else {
|
||||
@ -5474,8 +5477,12 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
||||
// The pointer operand uses an in-tree scalar, so add the new BitCast to
|
||||
// ExternalUses to make sure that an extract will be generated in the
|
||||
// future.
|
||||
if (getTreeEntry(ScalarPtr))
|
||||
ExternalUses.push_back(ExternalUser(ScalarPtr, cast<User>(VecPtr), 0));
|
||||
if (TreeEntry *Entry = getTreeEntry(ScalarPtr)) {
|
||||
// Find which lane we need to extract.
|
||||
unsigned FoundLane = Entry->findLaneForValue(ScalarPtr);
|
||||
ExternalUses.push_back(
|
||||
ExternalUser(ScalarPtr, cast<User>(VecPtr), FoundLane));
|
||||
}
|
||||
|
||||
Value *V = propagateMetadata(ST, E->Scalars);
|
||||
|
||||
@ -5577,8 +5584,14 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
||||
// The scalar argument uses an in-tree scalar so we add the new vectorized
|
||||
// call to ExternalUses list to make sure that an extract will be
|
||||
// generated in the future.
|
||||
if (ScalarArg && getTreeEntry(ScalarArg))
|
||||
ExternalUses.push_back(ExternalUser(ScalarArg, cast<User>(V), 0));
|
||||
if (ScalarArg) {
|
||||
if (TreeEntry *Entry = getTreeEntry(ScalarArg)) {
|
||||
// Find which lane we need to extract.
|
||||
unsigned FoundLane = Entry->findLaneForValue(ScalarArg);
|
||||
ExternalUses.push_back(
|
||||
ExternalUser(ScalarArg, cast<User>(V), FoundLane));
|
||||
}
|
||||
}
|
||||
|
||||
propagateIRFlags(V, E->Scalars, VL0);
|
||||
ShuffleBuilder.addMask(E->ReuseShuffleIndices);
|
||||
|
Loading…
Reference in New Issue
Block a user