[llvm] 52b345d - [RISCV][TII] Add and use new hook to simplify/canonicalize instructions after MachineCopyPropagation (#137973)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 8 04:33:17 PDT 2025
Author: Alex Bradbury
Date: 2025-05-08T12:33:14+01:00
New Revision: 52b345d036677e6377ea5e2022a1b6bd403ed91e
URL: https://github.com/llvm/llvm-project/commit/52b345d036677e6377ea5e2022a1b6bd403ed91e
DIFF: https://github.com/llvm/llvm-project/commit/52b345d036677e6377ea5e2022a1b6bd403ed91e.diff
LOG: [RISCV][TII] Add and use new hook to simplify/canonicalize instructions after MachineCopyPropagation (#137973)
PR #136875 was posted as a draft PR that handled a subset of these
cases, using the CompressPat mechanism. The consensus from that
discussion (and a conclusion I agree with) is that it would be
beneficial doing this optimisation earlier on, and in a way that isn't
limited just to cases that can be handled by instruction compression.
The most common source for instructions that can be
optimized/canonicalized in this way is through tail duplication in
MachineBlockPlacement followed by machine copy propagation. For RISC-V,
choosing a more canonical instruction allows it to be compressed when it
couldn't be before. There is the potential that it would make other
MI-level optimisations easier.
This modifies ~910 instructions across an llvm-test-suite build
including SPEC2017, targeting rva22u64. Looking at the diff, it seems
there's room for eliminating instructions or further propagating after
this.
Coverage of instructions is based on observations from a script written
to find redundant or improperly canonicalized instructions (though I aim
to support all instructions in a 'group' at once, e.g. MUL* even if I
only saw some variants of MUL in practice).
Added:
Modified:
llvm/include/llvm/CodeGen/TargetInstrInfo.h
llvm/lib/CodeGen/MachineCopyPropagation.cpp
llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
llvm/lib/Target/RISCV/RISCVInstrInfo.h
llvm/test/CodeGen/RISCV/machine-copyprop-simplifyinstruction.mir
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/TargetInstrInfo.h b/llvm/include/llvm/CodeGen/TargetInstrInfo.h
index 0aac02d3dc786..93bb9cae6c634 100644
--- a/llvm/include/llvm/CodeGen/TargetInstrInfo.h
+++ b/llvm/include/llvm/CodeGen/TargetInstrInfo.h
@@ -510,6 +510,16 @@ class TargetInstrInfo : public MCInstrInfo {
return false;
}
+ /// If possible, converts the instruction to a simplified/canonical form.
+ /// Returns true if the instruction was modified.
+ ///
+ /// This function is only called after register allocation. The MI will be
+ /// modified in place. This is called by passes such as
+ /// MachineCopyPropagation, where their mutation of the MI operands may
+ /// expose opportunities to convert the instruction to a simpler form (e.g.
+ /// a load of 0).
+ virtual bool simplifyInstruction(MachineInstr &MI) const { return false; }
+
/// A pair composed of a register and a sub-register index.
/// Used to give some type checking when modeling Reg:SubReg.
struct RegSubRegPair {
diff --git a/llvm/lib/CodeGen/MachineCopyPropagation.cpp b/llvm/lib/CodeGen/MachineCopyPropagation.cpp
index ff75b87b23128..224588b9d52ed 100644
--- a/llvm/lib/CodeGen/MachineCopyPropagation.cpp
+++ b/llvm/lib/CodeGen/MachineCopyPropagation.cpp
@@ -870,6 +870,12 @@ void MachineCopyPropagation::forwardUses(MachineInstr &MI) {
++NumCopyForwards;
Changed = true;
}
+ // Attempt to canonicalize/optimize the instruction now its arguments have
+ // been mutated.
+ if (TII->simplifyInstruction(MI)) {
+ Changed = true;
+ LLVM_DEBUG(dbgs() << "MCP: After optimizeInstruction: " << MI);
+ }
}
void MachineCopyPropagation::ForwardCopyPropagateBlock(MachineBasicBlock &MBB) {
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
index 3ff683a0a8184..87c67ee493b0b 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -2347,6 +2347,21 @@ static unsigned getSHXADDShiftAmount(unsigned Opc) {
}
}
+// Returns the shift amount from a SHXADD.UW instruction. Returns 0 if the
+// instruction is not a SHXADD.UW.
+static unsigned getSHXADDUWShiftAmount(unsigned Opc) {
+ switch (Opc) {
+ default:
+ return 0;
+ case RISCV::SH1ADD_UW:
+ return 1;
+ case RISCV::SH2ADD_UW:
+ return 2;
+ case RISCV::SH3ADD_UW:
+ return 3;
+ }
+}
+
// Look for opportunities to combine (sh3add Z, (add X, (slli Y, 5))) into
// (sh3add (sh2add Y, Z), X).
static bool getSHXADDPatterns(const MachineInstr &Root,
@@ -3876,6 +3891,216 @@ MachineInstr *RISCVInstrInfo::commuteInstructionImpl(MachineInstr &MI,
#undef CASE_VFMA_OPCODE_VV
#undef CASE_VFMA_SPLATS
+bool RISCVInstrInfo::simplifyInstruction(MachineInstr &MI) const {
+ switch (MI.getOpcode()) {
+ default:
+ break;
+ case RISCV::ADD:
+ case RISCV::OR:
+ case RISCV::XOR:
+ // Normalize (so we hit the next if clause).
+ // add/[x]or rd, zero, rs => add/[x]or rd, rs, zero
+ if (MI.getOperand(1).getReg() == RISCV::X0)
+ commuteInstruction(MI);
+ // add/[x]or rd, rs, zero => addi rd, rs, 0
+ if (MI.getOperand(2).getReg() == RISCV::X0) {
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ // xor rd, rs, rs => addi rd, zero, 0
+ if (MI.getOpcode() == RISCV::XOR &&
+ MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
+ MI.getOperand(1).setReg(RISCV::X0);
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::ORI:
+ case RISCV::XORI:
+ // [x]ori rd, zero, N => addi rd, zero, N
+ if (MI.getOperand(1).getReg() == RISCV::X0) {
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::SUB:
+ // sub rd, rs, zero => addi rd, rs, 0
+ if (MI.getOperand(2).getReg() == RISCV::X0) {
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::SUBW:
+ // subw rd, rs, zero => addiw rd, rs, 0
+ if (MI.getOperand(2).getReg() == RISCV::X0) {
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDIW));
+ return true;
+ }
+ break;
+ case RISCV::ADDW:
+ // Normalize (so we hit the next if clause).
+ // addw rd, zero, rs => addw rd, rs, zero
+ if (MI.getOperand(1).getReg() == RISCV::X0)
+ commuteInstruction(MI);
+ // addw rd, rs, zero => addiw rd, rs, 0
+ if (MI.getOperand(2).getReg() == RISCV::X0) {
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDIW));
+ return true;
+ }
+ break;
+ case RISCV::SH1ADD:
+ case RISCV::SH1ADD_UW:
+ case RISCV::SH2ADD:
+ case RISCV::SH2ADD_UW:
+ case RISCV::SH3ADD:
+ case RISCV::SH3ADD_UW:
+ // shNadd[.uw] rd, zero, rs => addi rd, rs, 0
+ if (MI.getOperand(1).getReg() == RISCV::X0) {
+ MI.removeOperand(1);
+ MI.addOperand(MachineOperand::CreateImm(0));
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ // shNadd[.uw] rd, rs, zero => slli[.uw] rd, rs, N
+ if (MI.getOperand(2).getReg() == RISCV::X0) {
+ MI.removeOperand(2);
+ unsigned Opc = MI.getOpcode();
+ if (Opc == RISCV::SH1ADD_UW || Opc == RISCV::SH2ADD_UW ||
+ Opc == RISCV::SH3ADD_UW) {
+ MI.addOperand(MachineOperand::CreateImm(getSHXADDUWShiftAmount(Opc)));
+ MI.setDesc(get(RISCV::SLLI_UW));
+ return true;
+ }
+ MI.addOperand(MachineOperand::CreateImm(getSHXADDShiftAmount(Opc)));
+ MI.setDesc(get(RISCV::SLLI));
+ return true;
+ }
+ break;
+ case RISCV::AND:
+ case RISCV::MUL:
+ case RISCV::MULH:
+ case RISCV::MULHSU:
+ case RISCV::MULHU:
+ case RISCV::MULW:
+ // and rd, zero, rs => addi rd, zero, 0
+ // mul* rd, zero, rs => addi rd, zero, 0
+ // and rd, rs, zero => addi rd, zero, 0
+ // mul* rd, rs, zero => addi rd, zero, 0
+ if (MI.getOperand(1).getReg() == RISCV::X0 ||
+ MI.getOperand(2).getReg() == RISCV::X0) {
+ MI.getOperand(1).setReg(RISCV::X0);
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::ANDI:
+ // andi rd, zero, C => addi rd, zero, 0
+ if (MI.getOperand(1).getReg() == RISCV::X0) {
+ MI.getOperand(2).setImm(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::SLL:
+ case RISCV::SRL:
+ case RISCV::SRA:
+ // shift rd, zero, rs => addi rd, zero, 0
+ if (MI.getOperand(1).getReg() == RISCV::X0) {
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ // shift rd, rs, zero => addi rd, rs, 0
+ if (MI.getOperand(2).getReg() == RISCV::X0) {
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::SLLW:
+ case RISCV::SRLW:
+ case RISCV::SRAW:
+ // shiftw rd, zero, rs => addi rd, zero, 0
+ if (MI.getOperand(1).getReg() == RISCV::X0) {
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::SLLI:
+ case RISCV::SRLI:
+ case RISCV::SRAI:
+ case RISCV::SLLIW:
+ case RISCV::SRLIW:
+ case RISCV::SRAIW:
+ case RISCV::SLLI_UW:
+ // shiftimm rd, zero, N => addi rd, zero, 0
+ if (MI.getOperand(1).getReg() == RISCV::X0) {
+ MI.getOperand(2).setImm(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::SLTU:
+ case RISCV::ADD_UW:
+ // sltu rd, zero, zero => addi rd, zero, 0
+ // add.uw rd, zero, zero => addi rd, zero, 0
+ if (MI.getOperand(1).getReg() == RISCV::X0 &&
+ MI.getOperand(2).getReg() == RISCV::X0) {
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ // add.uw rd, zero, rs => addi rd, rs, 0
+ if (MI.getOpcode() == RISCV::ADD_UW &&
+ MI.getOperand(1).getReg() == RISCV::X0) {
+ MI.removeOperand(1);
+ MI.addOperand(MachineOperand::CreateImm(0));
+ MI.setDesc(get(RISCV::ADDI));
+ }
+ break;
+ case RISCV::SLTIU:
+ // sltiu rd, zero, NZC => addi rd, zero, 1
+ // sltiu rd, zero, 0 => addi rd, zero, 0
+ if (MI.getOperand(1).getReg() == RISCV::X0) {
+ MI.getOperand(2).setImm(MI.getOperand(2).getImm() != 0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::SEXT_H:
+ case RISCV::SEXT_B:
+ case RISCV::ZEXT_H_RV32:
+ case RISCV::ZEXT_H_RV64:
+ // sext.[hb] rd, zero => addi rd, zero, 0
+ // zext.h rd, zero => addi rd, zero, 0
+ if (MI.getOperand(1).getReg() == RISCV::X0) {
+ MI.addOperand(MachineOperand::CreateImm(0));
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ case RISCV::MIN:
+ case RISCV::MINU:
+ case RISCV::MAX:
+ case RISCV::MAXU:
+ // min|max rd, rs, rs => addi rd, rs, 0
+ if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
+ MI.getOperand(2).ChangeToImmediate(0);
+ MI.setDesc(get(RISCV::ADDI));
+ return true;
+ }
+ break;
+ }
+ return false;
+}
+
// clang-format off
#define CASE_WIDEOP_OPCODE_COMMON(OP, LMUL) \
RISCV::PseudoV##OP##_##LMUL##_TIED
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.h b/llvm/lib/Target/RISCV/RISCVInstrInfo.h
index e4d43b12d65d4..1ec6eed82469e 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.h
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.h
@@ -242,6 +242,8 @@ class RISCVInstrInfo : public RISCVGenInstrInfo {
unsigned OpIdx1,
unsigned OpIdx2) const override;
+ bool simplifyInstruction(MachineInstr &MI) const override;
+
MachineInstr *convertToThreeAddress(MachineInstr &MI, LiveVariables *LV,
LiveIntervals *LIS) const override;
diff --git a/llvm/test/CodeGen/RISCV/machine-copyprop-simplifyinstruction.mir b/llvm/test/CodeGen/RISCV/machine-copyprop-simplifyinstruction.mir
index a781805f83256..15a6d53f343c1 100644
--- a/llvm/test/CodeGen/RISCV/machine-copyprop-simplifyinstruction.mir
+++ b/llvm/test/CodeGen/RISCV/machine-copyprop-simplifyinstruction.mir
@@ -4,14 +4,12 @@
# Check that instruction simplifications expected to be performed after
# machine copy propagation are done.
-# TODO: Not yet implemented.
-
---
name: add1
body: |
bb.0:
; CHECK-LABEL: name: add1
- ; CHECK: renamable $x10 = ADD $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = ADD renamable $x11, $x0
@@ -22,7 +20,7 @@ name: add2
body: |
bb.0:
; CHECK-LABEL: name: add2
- ; CHECK: renamable $x10 = ADD $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = ADD $x0, renamable $x11
@@ -33,7 +31,7 @@ name: or1
body: |
bb.0:
; CHECK-LABEL: name: or1
- ; CHECK: renamable $x10 = OR $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = OR renamable $x11, $x0
@@ -44,7 +42,7 @@ name: or2
body: |
bb.0:
; CHECK-LABEL: name: or2
- ; CHECK: renamable $x10 = OR $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = OR $x0, renamable $x11
@@ -55,7 +53,7 @@ name: xor1
body: |
bb.0:
; CHECK-LABEL: name: xor1
- ; CHECK: renamable $x10 = XOR $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = XOR renamable $x11, $x0
@@ -66,7 +64,7 @@ name: xor2
body: |
bb.0:
; CHECK-LABEL: name: xor2
- ; CHECK: renamable $x10 = XOR $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = XOR $x0, renamable $x11
@@ -78,7 +76,7 @@ name: xor3
body: |
bb.0:
; CHECK-LABEL: name: xor3
- ; CHECK: renamable $x10 = XOR $x12, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = XOR renamable $x11, renamable $x11
@@ -89,7 +87,7 @@ name: addw1
body: |
bb.0:
; CHECK-LABEL: name: addw1
- ; CHECK: renamable $x10 = ADDW $x0, $x12
+ ; CHECK: renamable $x10 = ADDIW $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = ADDW renamable $x11, $x12
@@ -100,7 +98,7 @@ name: addw2
body: |
bb.0:
; CHECK-LABEL: name: addw2
- ; CHECK: renamable $x10 = ADDW $x12, $x0
+ ; CHECK: renamable $x10 = ADDIW $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = ADDW $x12, renamable $x11
@@ -111,7 +109,7 @@ name: sub
body: |
bb.0:
; CHECK-LABEL: name: sub
- ; CHECK: renamable $x10 = SUB $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SUB renamable $x11, $x0
@@ -122,7 +120,7 @@ name: subw
body: |
bb.0:
; CHECK-LABEL: name: subw
- ; CHECK: renamable $x10 = SUBW $x12, $x0
+ ; CHECK: renamable $x10 = ADDIW $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SUBW renamable $x11, $x0
@@ -133,7 +131,7 @@ name: sh1add1
body: |
bb.0:
; CHECK-LABEL: name: sh1add1
- ; CHECK: renamable $x10 = SH1ADD $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH1ADD $x0, renamable $x11
@@ -144,7 +142,7 @@ name: sh1add2
body: |
bb.0:
; CHECK-LABEL: name: sh1add2
- ; CHECK: renamable $x10 = SH1ADD $x12, $x0
+ ; CHECK: renamable $x10 = SLLI $x12, 1
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH1ADD renamable $x11, $x0
@@ -155,7 +153,7 @@ name: sh1add.uw1
body: |
bb.0:
; CHECK-LABEL: name: sh1add.uw1
- ; CHECK: renamable $x10 = SH1ADD_UW $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH1ADD_UW $x0, renamable $x11
@@ -166,7 +164,7 @@ name: sh1add.uw2
body: |
bb.0:
; CHECK-LABEL: name: sh1add.uw2
- ; CHECK: renamable $x10 = SH1ADD_UW $x12, $x0
+ ; CHECK: renamable $x10 = SLLI_UW $x12, 1
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH1ADD_UW renamable $x11, $x0
@@ -177,7 +175,7 @@ name: sh2add1
body: |
bb.0:
; CHECK-LABEL: name: sh2add1
- ; CHECK: renamable $x10 = SH2ADD $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH2ADD $x0, renamable $x11
@@ -188,7 +186,7 @@ name: sh2add2
body: |
bb.0:
; CHECK-LABEL: name: sh2add2
- ; CHECK: renamable $x10 = SH2ADD $x12, $x0
+ ; CHECK: renamable $x10 = SLLI $x12, 2
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH2ADD renamable $x11, $x0
@@ -199,7 +197,7 @@ name: sh2add.uw1
body: |
bb.0:
; CHECK-LABEL: name: sh2add.uw1
- ; CHECK: renamable $x10 = SH2ADD_UW $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH2ADD_UW $x0, renamable $x11
@@ -210,7 +208,7 @@ name: sh2add.uw2
body: |
bb.0:
; CHECK-LABEL: name: sh2add.uw2
- ; CHECK: renamable $x10 = SH2ADD_UW $x12, $x0
+ ; CHECK: renamable $x10 = SLLI_UW $x12, 2
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH2ADD_UW renamable $x11, $x0
@@ -221,7 +219,7 @@ name: sh3add1
body: |
bb.0:
; CHECK-LABEL: name: sh3add1
- ; CHECK: renamable $x10 = SH3ADD $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH3ADD $x0, renamable $x11
@@ -232,7 +230,7 @@ name: sh3add2
body: |
bb.0:
; CHECK-LABEL: name: sh3add2
- ; CHECK: renamable $x10 = SH3ADD $x12, $x0
+ ; CHECK: renamable $x10 = SLLI $x12, 3
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH3ADD renamable $x11, $x0
@@ -243,7 +241,7 @@ name: sh3add.uw1
body: |
bb.0:
; CHECK-LABEL: name: sh3add.uw1
- ; CHECK: renamable $x10 = SH3ADD_UW $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH3ADD_UW $x0, renamable $x11
@@ -254,7 +252,7 @@ name: sh3add.uw2
body: |
bb.0:
; CHECK-LABEL: name: sh3add.uw2
- ; CHECK: renamable $x10 = SH3ADD_UW $x12, $x0
+ ; CHECK: renamable $x10 = SLLI_UW $x12, 3
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SH3ADD_UW renamable $x11, $x0
@@ -265,7 +263,7 @@ name: andi
body: |
bb.0:
; CHECK-LABEL: name: andi
- ; CHECK: renamable $x10 = ANDI $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = ANDI renamable $x11, 13
@@ -276,7 +274,7 @@ name: and1
body: |
bb.0:
; CHECK-LABEL: name: and1
- ; CHECK: renamable $x10 = AND $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = AND renamable $x11, $x0
@@ -287,7 +285,7 @@ name: and2
body: |
bb.0:
; CHECK-LABEL: name: and2
- ; CHECK: renamable $x10 = AND $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = AND $x0, renamable $x11
@@ -298,7 +296,7 @@ name: mul1
body: |
bb.0:
; CHECK-LABEL: name: mul1
- ; CHECK: renamable $x10 = MUL $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MUL renamable $x11, $x0
@@ -309,7 +307,7 @@ name: mul2
body: |
bb.0:
; CHECK-LABEL: name: mul2
- ; CHECK: renamable $x10 = MUL $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MUL $x0, renamable $x11
@@ -320,7 +318,7 @@ name: mulh1
body: |
bb.0:
; CHECK-LABEL: name: mulh1
- ; CHECK: renamable $x10 = MULH $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MULH renamable $x11, $x0
@@ -331,7 +329,7 @@ name: mulh2
body: |
bb.0:
; CHECK-LABEL: name: mulh2
- ; CHECK: renamable $x10 = MULH $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MULH $x0, renamable $x11
@@ -342,7 +340,7 @@ name: mulhsu1
body: |
bb.0:
; CHECK-LABEL: name: mulhsu1
- ; CHECK: renamable $x10 = MULHSU $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MULHSU renamable $x11, $x0
@@ -353,7 +351,7 @@ name: mulhsu2
body: |
bb.0:
; CHECK-LABEL: name: mulhsu2
- ; CHECK: renamable $x10 = MULHSU $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MULHSU $x0, renamable $x11
@@ -364,7 +362,7 @@ name: mulhu1
body: |
bb.0:
; CHECK-LABEL: name: mulhu1
- ; CHECK: renamable $x10 = MULHU $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MULHU renamable $x11, $x0
@@ -375,7 +373,7 @@ name: mulhu2
body: |
bb.0:
; CHECK-LABEL: name: mulhu2
- ; CHECK: renamable $x10 = MULHU $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MULHU $x0, renamable $x11
@@ -386,7 +384,7 @@ name: mulw1
body: |
bb.0:
; CHECK-LABEL: name: mulw1
- ; CHECK: renamable $x10 = MULW $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MULW renamable $x11, $x0
@@ -397,7 +395,7 @@ name: mulw2
body: |
bb.0:
; CHECK-LABEL: name: mulw2
- ; CHECK: renamable $x10 = MULW $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MULW $x0, renamable $x11
@@ -408,7 +406,7 @@ name: slli
body: |
bb.0:
; CHECK-LABEL: name: slli
- ; CHECK: renamable $x10 = SLLI $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SLLI renamable $x11, 13
@@ -419,7 +417,7 @@ name: srli
body: |
bb.0:
; CHECK-LABEL: name: srli
- ; CHECK: renamable $x10 = SRLI $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SRLI renamable $x11, 13
@@ -430,7 +428,7 @@ name: srai
body: |
bb.0:
; CHECK-LABEL: name: srai
- ; CHECK: renamable $x10 = SRAI $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SRAI renamable $x11, 13
@@ -441,7 +439,7 @@ name: slliw
body: |
bb.0:
; CHECK-LABEL: name: slliw
- ; CHECK: renamable $x10 = SLLIW $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SLLIW renamable $x11, 13
@@ -452,7 +450,7 @@ name: srliw
body: |
bb.0:
; CHECK-LABEL: name: srliw
- ; CHECK: renamable $x10 = SRLIW $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SRLIW renamable $x11, 13
@@ -463,7 +461,7 @@ name: sraiw
body: |
bb.0:
; CHECK-LABEL: name: sraiw
- ; CHECK: renamable $x10 = SRAIW $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SRAIW renamable $x11, 13
@@ -474,7 +472,7 @@ name: slli_uw
body: |
bb.0:
; CHECK-LABEL: name: slli_uw
- ; CHECK: renamable $x10 = SLLI_UW $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SLLI_UW renamable $x11, 13
@@ -485,7 +483,7 @@ name: ori
body: |
bb.0:
; CHECK-LABEL: name: ori
- ; CHECK: renamable $x10 = ORI $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 13
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = ORI renamable $x11, 13
@@ -496,7 +494,7 @@ name: xori
body: |
bb.0:
; CHECK-LABEL: name: xori
- ; CHECK: renamable $x10 = XORI $x0, 13
+ ; CHECK: renamable $x10 = ADDI $x0, 13
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = XORI renamable $x11, 13
@@ -507,7 +505,7 @@ name: sltiu1
body: |
bb.0:
; CHECK-LABEL: name: sltiu1
- ; CHECK: renamable $x10 = SLTIU $x0, 2
+ ; CHECK: renamable $x10 = ADDI $x0, 1
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SLTIU renamable $x11, 2
@@ -518,7 +516,7 @@ name: sltiu2
body: |
bb.0:
; CHECK-LABEL: name: sltiu2
- ; CHECK: renamable $x10 = SLTIU $x0, 0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SLTIU renamable $x11, 0
@@ -529,7 +527,7 @@ name: sltu
body: |
bb.0:
; CHECK-LABEL: name: sltu
- ; CHECK: renamable $x10 = SLTU $x0, $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SLTU renamable $x11, $x0
@@ -540,7 +538,7 @@ name: add.uw1
body: |
bb.0:
; CHECK-LABEL: name: add.uw1
- ; CHECK: renamable $x10 = ADD_UW $x0, $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = ADD_UW renamable $x11, $x0
@@ -551,7 +549,7 @@ name: add.uw2
body: |
bb.0:
; CHECK-LABEL: name: add.uw2
- ; CHECK: renamable $x10 = ADD_UW $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = ADD_UW $x0, renamable $x11
@@ -562,7 +560,7 @@ name: sext.h
body: |
bb.0:
; CHECK-LABEL: name: sext.h
- ; CHECK: renamable $x10 = SEXT_H $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SEXT_H renamable $x11
@@ -573,7 +571,7 @@ name: sext.b
body: |
bb.0:
; CHECK-LABEL: name: sext.b
- ; CHECK: renamable $x10 = SEXT_B $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = SEXT_B renamable $x11
@@ -584,7 +582,7 @@ name: zext.h.rv32
body: |
bb.0:
; CHECK-LABEL: name: zext.h.rv32
- ; CHECK: renamable $x10 = ZEXT_H_RV32 $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = ZEXT_H_RV32 renamable $x11
@@ -595,7 +593,7 @@ name: zext.h.rv64
body: |
bb.0:
; CHECK-LABEL: name: zext.h.rv64
- ; CHECK: renamable $x10 = ZEXT_H_RV64 $x0
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x0
renamable $x10 = ZEXT_H_RV64 renamable $x11
@@ -606,7 +604,7 @@ name: sll1
body: |
bb.0:
; CHECK-LABEL: name: sll1
- ; CHECK: renamable $x10 = SLL $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SLL $x0, renamable $x11
@@ -617,7 +615,7 @@ name: sll2
body: |
bb.0:
; CHECK-LABEL: name: sll2
- ; CHECK: renamable $x10 = SLL $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SLL renamable $x11, $x0
@@ -628,7 +626,7 @@ name: sr11
body: |
bb.0:
; CHECK-LABEL: name: sr11
- ; CHECK: renamable $x10 = SRL $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SRL $x0, renamable $x11
@@ -639,7 +637,7 @@ name: sr12
body: |
bb.0:
; CHECK-LABEL: name: sr12
- ; CHECK: renamable $x10 = SRL $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SRL renamable $x11, $x0
@@ -650,7 +648,7 @@ name: sra1
body: |
bb.0:
; CHECK-LABEL: name: sra1
- ; CHECK: renamable $x10 = SRA $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SRA $x0, renamable $x11
@@ -661,7 +659,7 @@ name: sra2
body: |
bb.0:
; CHECK-LABEL: name: sra2
- ; CHECK: renamable $x10 = SRA $x12, $x0
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SRA renamable $x11, $x0
@@ -672,7 +670,7 @@ name: sllw
body: |
bb.0:
; CHECK-LABEL: name: sllw
- ; CHECK: renamable $x10 = SLLW $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SLLW $x0, renamable $x11
@@ -683,7 +681,7 @@ name: srlw
body: |
bb.0:
; CHECK-LABEL: name: srlw
- ; CHECK: renamable $x10 = SRLW $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SRLW $x0, renamable $x11
@@ -694,7 +692,7 @@ name: sraw
body: |
bb.0:
; CHECK-LABEL: name: sraw
- ; CHECK: renamable $x10 = SRAW $x0, $x12
+ ; CHECK: renamable $x10 = ADDI $x0, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = SRAW $x0, renamable $x11
@@ -705,7 +703,7 @@ name: min
body: |
bb.0:
; CHECK-LABEL: name: min
- ; CHECK: renamable $x10 = MIN $x12, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MIN renamable $x11, renamable $x11
@@ -716,7 +714,7 @@ name: minu
body: |
bb.0:
; CHECK-LABEL: name: minu
- ; CHECK: renamable $x10 = MINU $x12, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MINU renamable $x11, renamable $x11
@@ -727,7 +725,7 @@ name: max
body: |
bb.0:
; CHECK-LABEL: name: max
- ; CHECK: renamable $x10 = MAX $x12, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MAX renamable $x11, renamable $x11
@@ -738,7 +736,7 @@ name: maxu
body: |
bb.0:
; CHECK-LABEL: name: maxu
- ; CHECK: renamable $x10 = MAXU $x12, $x12
+ ; CHECK: renamable $x10 = ADDI $x12, 0
; CHECK-NEXT: PseudoRET implicit $x10
renamable $x11 = COPY $x12
renamable $x10 = MAXU renamable $x11, renamable $x11
More information about the llvm-commits
mailing list