diff options
| author | Artem Belevich <tra@google.com> | 2018-05-11 21:13:19 +0000 |
|---|---|---|
| committer | Artem Belevich <tra@google.com> | 2018-05-11 21:13:19 +0000 |
| commit | c2cd5d5ce053b49c1a75216a8e9c7b4f298319ad (patch) | |
| tree | fe4cdac48ccc2013e5052da5b6b206d9c3963ec7 /llvm/lib | |
| parent | f108a8fee10fb189faff4b2edbecbec8b6322a58 (diff) | |
| download | bcm5719-llvm-c2cd5d5ce053b49c1a75216a8e9c7b4f298319ad.tar.gz bcm5719-llvm-c2cd5d5ce053b49c1a75216a8e9c7b4f298319ad.zip | |
[Split GEP] handle trunc() in separate-const-offset-from-gep pass.
Let separate-const-offset-from-gep pass handle trunc() when it calculates
constant offset relative to base. The pass itself may insert trunc()
instructions when it canonicalises array indices to pointer-size integers
and needs to handle trunc() in order to evaluate the offset.
Differential Revision: https://reviews.llvm.org/D46732
llvm-svn: 332142
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp b/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp index e8a8328d24c..534fdfdb5e3 100644 --- a/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp +++ b/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp @@ -587,6 +587,10 @@ APInt ConstantOffsetExtractor::find(Value *V, bool SignExtended, // Trace into subexpressions for more hoisting opportunities. if (CanTraceInto(SignExtended, ZeroExtended, BO, NonNegative)) ConstantOffset = findInEitherOperand(BO, SignExtended, ZeroExtended); + } else if (isa<TruncInst>(V)) { + ConstantOffset = + find(U->getOperand(0), SignExtended, ZeroExtended, NonNegative) + .trunc(BitWidth); } else if (isa<SExtInst>(V)) { ConstantOffset = find(U->getOperand(0), /* SignExtended */ true, ZeroExtended, NonNegative).sext(BitWidth); @@ -651,8 +655,9 @@ ConstantOffsetExtractor::distributeExtsAndCloneChain(unsigned ChainIndex) { } if (CastInst *Cast = dyn_cast<CastInst>(U)) { - assert((isa<SExtInst>(Cast) || isa<ZExtInst>(Cast)) && - "We only traced into two types of CastInst: sext and zext"); + assert( + (isa<SExtInst>(Cast) || isa<ZExtInst>(Cast) || isa<TruncInst>(Cast)) && + "Only following instructions can be traced: sext, zext & trunc"); ExtInsts.push_back(Cast); UserChain[ChainIndex] = nullptr; return distributeExtsAndCloneChain(ChainIndex - 1); |

