aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp')
-rw-r--r--llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp b/llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp
index 788d8f9cfc85..effec2cc776d 100644
--- a/llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp
+++ b/llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp
@@ -174,11 +174,17 @@ static bool hasAllNBitUsers(const MachineInstr &OrigMI,
case RISCV::SLLI_UW:
case RISCV::FMV_W_X:
case RISCV::FCVT_H_W:
+ case RISCV::FCVT_H_W_INX:
case RISCV::FCVT_H_WU:
+ case RISCV::FCVT_H_WU_INX:
case RISCV::FCVT_S_W:
+ case RISCV::FCVT_S_W_INX:
case RISCV::FCVT_S_WU:
+ case RISCV::FCVT_S_WU_INX:
case RISCV::FCVT_D_W:
+ case RISCV::FCVT_D_W_INX:
case RISCV::FCVT_D_WU:
+ case RISCV::FCVT_D_WU_INX:
if (Bits >= 32)
break;
return false;
@@ -215,11 +221,13 @@ static bool hasAllNBitUsers(const MachineInstr &OrigMI,
// these overwrite higher input bits, otherwise the lower word of output
// depends only on the lower word of input. So check their uses read W.
- case RISCV::SLLI:
- if (Bits >= (ST.getXLen() - UserMI->getOperand(2).getImm()))
+ case RISCV::SLLI: {
+ unsigned ShAmt = UserMI->getOperand(2).getImm();
+ if (Bits >= (ST.getXLen() - ShAmt))
break;
- Worklist.push_back(std::make_pair(UserMI, Bits));
+ Worklist.push_back(std::make_pair(UserMI, Bits + ShAmt));
break;
+ }
case RISCV::ANDI: {
uint64_t Imm = UserMI->getOperand(2).getImm();
if (Bits >= (unsigned)llvm::bit_width(Imm))
@@ -348,8 +356,7 @@ static bool hasAllWUsers(const MachineInstr &OrigMI, const RISCVSubtarget &ST,
// This function returns true if the machine instruction always outputs a value
// where bits 63:32 match bit 31.
-static bool isSignExtendingOpW(const MachineInstr &MI,
- const MachineRegisterInfo &MRI, unsigned OpNo) {
+static bool isSignExtendingOpW(const MachineInstr &MI, unsigned OpNo) {
uint64_t TSFlags = MI.getDesc().TSFlags;
// Instructions that can be determined from opcode are marked in tablegen.
@@ -424,7 +431,7 @@ static bool isSignExtendedW(Register SrcReg, const RISCVSubtarget &ST,
assert(OpNo != -1 && "Couldn't find register");
// If this is a sign extending operation we don't need to look any further.
- if (isSignExtendingOpW(*MI, MRI, OpNo))
+ if (isSignExtendingOpW(*MI, OpNo))
continue;
// Is this an instruction that propagates sign extend?