diff options
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp')
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp b/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp index de2227f82192..e487cc8b2e20 100644 --- a/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp +++ b/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp @@ -198,13 +198,23 @@ char RISCVInsertWriteVXRM::ID = 0; INITIALIZE_PASS(RISCVInsertWriteVXRM, DEBUG_TYPE, RISCV_INSERT_WRITE_VXRM_NAME, false, false) +static bool ignoresVXRM(const MachineInstr &MI) { + switch (RISCV::getRVVMCOpcode(MI.getOpcode())) { + default: + return false; + case RISCV::VNCLIP_WI: + case RISCV::VNCLIPU_WI: + return MI.getOperand(3).getImm() == 0; + } +} + bool RISCVInsertWriteVXRM::computeVXRMChanges(const MachineBasicBlock &MBB) { BlockData &BBInfo = BlockInfo[MBB.getNumber()]; bool NeedVXRMWrite = false; for (const MachineInstr &MI : MBB) { int VXRMIdx = RISCVII::getVXRMOpNum(MI.getDesc()); - if (VXRMIdx >= 0) { + if (VXRMIdx >= 0 && !ignoresVXRM(MI)) { unsigned NewVXRMImm = MI.getOperand(VXRMIdx).getImm(); if (!BBInfo.VXRMUse.isValid()) @@ -356,7 +366,7 @@ void RISCVInsertWriteVXRM::emitWriteVXRM(MachineBasicBlock &MBB) { for (MachineInstr &MI : MBB) { int VXRMIdx = RISCVII::getVXRMOpNum(MI.getDesc()); - if (VXRMIdx >= 0) { + if (VXRMIdx >= 0 && !ignoresVXRM(MI)) { unsigned NewVXRMImm = MI.getOperand(VXRMIdx).getImm(); if (PendingInsert || !Info.isStatic() || |
