diff options
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp')
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp index 43c04d417c7d..604234b24315 100644 --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -1461,7 +1461,12 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) { SDValue X = N0.getOperand(0); - if (isMask_64(C1)) { + // Prefer SRAIW + ANDI when possible. + bool Skip = C2 > 32 && isInt<12>(N1C->getSExtValue()) && + X.getOpcode() == ISD::SHL && + isa<ConstantSDNode>(X.getOperand(1)) && + X.getConstantOperandVal(1) == 32; + if (isMask_64(C1) && !Skip) { unsigned Leading = XLen - llvm::bit_width(C1); if (C2 > Leading) { SDNode *SRAI = CurDAG->getMachineNode( |
