diff options
author | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2018-03-14 17:10:58 +0000 |
---|---|---|
committer | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2018-03-14 17:10:58 +0000 |
commit | 084e7d8770a27a7caf80a6eb63fbe07d61c6b198 (patch) | |
tree | 9250e3ef9743a42581e9b8d06fd6e7ae6713afba /llvm/lib | |
parent | bec5df2d05de26b136192d1a57e7638a703d2f06 (diff) | |
download | bcm5719-llvm-084e7d8770a27a7caf80a6eb63fbe07d61c6b198.tar.gz bcm5719-llvm-084e7d8770a27a7caf80a6eb63fbe07d61c6b198.zip |
[AArch64] Keep track of MIFlags in the LoadStoreOptimizer
Merging:
* $x26, $x25 = frame-setup LDPXi $sp, 0
* $sp = frame-destroy ADDXri $sp, 64, 0
into an LDPXpost should preserve the flags from both instructions as
following:
* frame-setup frame-destroy LDPXpost
Differential Revision: https://reviews.llvm.org/D44446
llvm-svn: 327533
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/MachineInstr.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp | 21 |
2 files changed, 20 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index 5f3989bbe7e..3fbf50df18b 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -381,6 +381,12 @@ MachineInstr::mergeMemRefsWith(const MachineInstr& Other) { return std::make_pair(MemBegin, CombinedNumMemRefs); } +uint8_t MachineInstr::mergeFlagsWith(const MachineInstr &Other) const { + // For now, the just return the union of the flags. If the flags get more + // complicated over time, we might need more logic here. + return getFlags() | Other.getFlags(); +} + bool MachineInstr::hasPropertyInBundle(unsigned Mask, QueryType Type) const { assert(!isBundledWithPred() && "Must be called on bundle header"); for (MachineBasicBlock::const_instr_iterator MII = getIterator();; ++MII) { diff --git a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp index 8a29456430b..84f161af572 100644 --- a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp +++ b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp @@ -702,7 +702,8 @@ AArch64LoadStoreOpt::mergeNarrowZeroStores(MachineBasicBlock::iterator I, .addReg(isNarrowStore(Opc) ? AArch64::WZR : AArch64::XZR) .add(BaseRegOp) .addImm(OffsetImm) - .setMemRefs(I->mergeMemRefsWith(*MergeMI)); + .setMemRefs(I->mergeMemRefsWith(*MergeMI)) + .setMIFlags(I->mergeFlagsWith(*MergeMI)); (void)MIB; DEBUG(dbgs() << "Creating wider store. Replacing instructions:\n "); @@ -818,7 +819,8 @@ AArch64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I, .add(RegOp1) .add(BaseRegOp) .addImm(OffsetImm) - .setMemRefs(I->mergeMemRefsWith(*Paired)); + .setMemRefs(I->mergeMemRefsWith(*Paired)) + .setMIFlags(I->mergeFlagsWith(*Paired)); (void)MIB; @@ -913,7 +915,8 @@ AArch64LoadStoreOpt::promoteLoadFromStore(MachineBasicBlock::iterator LoadI, TII->get(IsStoreXReg ? AArch64::ORRXrs : AArch64::ORRWrs), LdRt) .addReg(IsStoreXReg ? AArch64::XZR : AArch64::WZR) .add(StMO) - .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0)); + .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0)) + .setMIFlags(LoadI->getFlags()); } else { // FIXME: Currently we disable this transformation in big-endian targets as // performance and correctness are verified only in little-endian. @@ -954,7 +957,8 @@ AArch64LoadStoreOpt::promoteLoadFromStore(MachineBasicBlock::iterator LoadI, TII->get(IsStoreXReg ? AArch64::ANDXri : AArch64::ANDWri), DestReg) .add(StMO) - .addImm(AndMaskEncoded); + .addImm(AndMaskEncoded) + .setMIFlags(LoadI->getFlags()); } else { BitExtMI = BuildMI(*LoadI->getParent(), LoadI, LoadI->getDebugLoc(), @@ -962,7 +966,8 @@ AArch64LoadStoreOpt::promoteLoadFromStore(MachineBasicBlock::iterator LoadI, DestReg) .add(StMO) .addImm(Immr) - .addImm(Imms); + .addImm(Imms) + .setMIFlags(LoadI->getFlags()); } } @@ -1352,7 +1357,8 @@ AArch64LoadStoreOpt::mergeUpdateInsn(MachineBasicBlock::iterator I, .add(getLdStRegOp(*I)) .add(getLdStBaseOp(*I)) .addImm(Value) - .setMemRefs(I->memoperands_begin(), I->memoperands_end()); + .setMemRefs(I->memoperands_begin(), I->memoperands_end()) + .setMIFlags(I->mergeFlagsWith(*Update)); } else { // Paired instruction. int Scale = getMemScale(*I); @@ -1362,7 +1368,8 @@ AArch64LoadStoreOpt::mergeUpdateInsn(MachineBasicBlock::iterator I, .add(getLdStRegOp(*I, 1)) .add(getLdStBaseOp(*I)) .addImm(Value / Scale) - .setMemRefs(I->memoperands_begin(), I->memoperands_end()); + .setMemRefs(I->memoperands_begin(), I->memoperands_end()) + .setMIFlags(I->mergeFlagsWith(*Update)); } (void)MIB; |