diff options
author | David Green <david.green@arm.com> | 2019-07-22 12:51:38 +0000 |
---|---|---|
committer | David Green <david.green@arm.com> | 2019-07-22 12:51:38 +0000 |
commit | 8876a312a8192191a6bcc1e99352e54223e7b868 (patch) | |
tree | b4378f5221fea7b539c91f6d3350c13daa8a0a22 /llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp | |
parent | 8c5e6fa6575a57765248c158ddf88e4e383afd88 (diff) | |
download | bcm5719-llvm-8876a312a8192191a6bcc1e99352e54223e7b868.tar.gz bcm5719-llvm-8876a312a8192191a6bcc1e99352e54223e7b868.zip |
[ARM] Fix for MVE VPT block pass
We need to ensure that the number of T's is correct when adding multiple
instructions into the same VPT block.
Differential revision: https://reviews.llvm.org/D65049
llvm-svn: 366684
Diffstat (limited to 'llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp b/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp index 3143eb9840e..2087fd59906 100644 --- a/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp +++ b/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp @@ -388,8 +388,6 @@ bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) { MachineInstrBuilder MIBuilder = BuildMI(Block, MBIter, dl, TII->get(ARM::MVE_VPST)); - // The mask value for the VPST instruction is T = 0b1000 = 8 - MIBuilder.addImm(VPTMaskValue::T); MachineBasicBlock::iterator VPSTInsertPos = MIBuilder.getInstr(); int VPTInstCnt = 1; @@ -400,12 +398,29 @@ bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) { NextPred = getVPTInstrPredicate(*MBIter, PredReg); } while (NextPred != ARMVCC::None && NextPred == Pred && ++VPTInstCnt < 4); + switch (VPTInstCnt) { + case 1: + MIBuilder.addImm(VPTMaskValue::T); + break; + case 2: + MIBuilder.addImm(VPTMaskValue::TT); + break; + case 3: + MIBuilder.addImm(VPTMaskValue::TTT); + break; + case 4: + MIBuilder.addImm(VPTMaskValue::TTTT); + break; + default: + llvm_unreachable("Unexpected number of instruction in a VPT block"); + }; + MachineInstr *LastMI = &*MBIter; finalizeBundle(Block, VPSTInsertPos.getInstrIterator(), ++LastMI->getIterator()); Modified = true; - LLVM_DEBUG(dbgs() << "VPT block created for: "; MI->dump();); + LLVM_DEBUG(dbgs() << "VPT block created for: "; MI->dump()); ++MBIter; } |