diff options
author | Sam Parker <sam.parker@arm.com> | 2019-08-09 07:48:50 +0000 |
---|---|---|
committer | Sam Parker <sam.parker@arm.com> | 2019-08-09 07:48:50 +0000 |
commit | 0dba791a25e7e520760e0c5127434a0377bc50db (patch) | |
tree | a5c85200088fb4666ed7d3db9297358d457ba1dd /llvm/lib/Target/ARM/ARMParallelDSP.cpp | |
parent | ef0c3ddc7f4b240461c4ee701dd6712b8068dbd7 (diff) | |
download | llvm-0dba791a25e7e520760e0c5127434a0377bc50db.zip llvm-0dba791a25e7e520760e0c5127434a0377bc50db.tar.gz llvm-0dba791a25e7e520760e0c5127434a0377bc50db.tar.bz2 |
[ARM][ParallelDSP] Replace SExt uses
As loads are combined and widened, we replaced their sext users
operands whereas we should have been replacing the uses of the sext.
I've added a load of tests, with only a few of them originally
causing assertion failures, the rest improve pattern coverage.
Differential Revision: https://reviews.llvm.org/D65740
llvm-svn: 368404
Diffstat (limited to 'llvm/lib/Target/ARM/ARMParallelDSP.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMParallelDSP.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM/ARMParallelDSP.cpp b/llvm/lib/Target/ARM/ARMParallelDSP.cpp index a4d3fff..6ef03c6 100644 --- a/llvm/lib/Target/ARM/ARMParallelDSP.cpp +++ b/llvm/lib/Target/ARM/ARMParallelDSP.cpp @@ -68,7 +68,7 @@ namespace { } LoadInst *getBaseLoad() const { - return cast<LoadInst>(LHS); + return VecLd.front(); } }; @@ -696,13 +696,15 @@ LoadInst* ARMParallelDSP::CreateWideLoad(MemInstList &Loads, // Loads[0] needs trunc while Loads[1] needs a lshr and trunc. // TODO: Support big-endian as well. Value *Bottom = IRB.CreateTrunc(WideLoad, Base->getType()); - BaseSExt->setOperand(0, Bottom); + Value *NewBaseSExt = IRB.CreateSExt(Bottom, BaseSExt->getType()); + BaseSExt->replaceAllUsesWith(NewBaseSExt); IntegerType *OffsetTy = cast<IntegerType>(Offset->getType()); Value *ShiftVal = ConstantInt::get(LoadTy, OffsetTy->getBitWidth()); Value *Top = IRB.CreateLShr(WideLoad, ShiftVal); Value *Trunc = IRB.CreateTrunc(Top, OffsetTy); - OffsetSExt->setOperand(0, Trunc); + Value *NewOffsetSExt = IRB.CreateSExt(Trunc, OffsetSExt->getType()); + OffsetSExt->replaceAllUsesWith(NewOffsetSExt); WideLoads.emplace(std::make_pair(Base, make_unique<WidenedLoad>(Loads, WideLoad))); |