Skip to content

Commit

Permalink
[Scalarizer] visit{Insert,Extract}ElementInst(): avoid call arg evalu…
Browse files Browse the repository at this point in the history
…ation order deps

Compilers may evaluate call arguments in different order,
which would result in different order of IR, which would break the tests.

Spotted thanks to Dmitri Gribenko!
  • Loading branch information
LebedevRI committed Jul 6, 2020
1 parent 60b8b2b commit 5d7afe2
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions llvm/lib/Transforms/Scalar/Scalarizer.cpp
Expand Up @@ -769,10 +769,12 @@ bool ScalarizerVisitor::visitInsertElementInst(InsertElementInst &IEI) {
return false;

for (unsigned I = 0; I < NumElems; ++I) {
Res[I] = Builder.CreateSelect(
Value *ShouldReplace =
Builder.CreateICmpEQ(InsIdx, ConstantInt::get(InsIdx->getType(), I),
InsIdx->getName() + ".is." + Twine(I)),
NewElt, Op0[I], IEI.getName() + ".i" + Twine(I));
InsIdx->getName() + ".is." + Twine(I));
Value *OldElt = Op0[I];
Res[I] = Builder.CreateSelect(ShouldReplace, NewElt, OldElt,
IEI.getName() + ".i" + Twine(I));
}
}

Expand Down Expand Up @@ -801,10 +803,12 @@ bool ScalarizerVisitor::visitExtractElementInst(ExtractElementInst &EEI) {

Value *Res = UndefValue::get(VT->getElementType());
for (unsigned I = 0; I < NumSrcElems; ++I) {
Res = Builder.CreateSelect(
Value *ShouldExtract =
Builder.CreateICmpEQ(ExtIdx, ConstantInt::get(ExtIdx->getType(), I),
ExtIdx->getName() + ".is." + Twine(I)),
Op0[I], Res, EEI.getName() + ".upto" + Twine(I));
ExtIdx->getName() + ".is." + Twine(I));
Value *Elt = Op0[I];
Res = Builder.CreateSelect(ShouldExtract, Elt, Res,
EEI.getName() + ".upto" + Twine(I));
}
gather(&EEI, {Res});
return true;
Expand Down

0 comments on commit 5d7afe2

Please sign in to comment.