diff --git a/llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp b/llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp index 8baae84111a9..bfa4d7d9de7f 100644 --- a/llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp +++ b/llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp @@ -581,13 +581,17 @@ static bool isSignExtendedW(Register SrcReg, const RISCVSubtarget &ST, case RISCV::PseudoCCANDN: case RISCV::PseudoCCORN: case RISCV::PseudoCCXNOR: - case RISCV::PHI: { + case RISCV::PHI: + case RISCV::MERGE: + case RISCV::MVM: + case RISCV::MVMN: { // If all incoming values are sign-extended, the output of AND, OR, XOR, - // MIN, MAX, or PHI is also sign-extended. + // MIN, MAX, PHI, or bitwise merge instructions is also sign-extended. // The input registers for PHI are operand 1, 3, ... // The input registers for PseudoCCMOVGPR(NoX0) are 4 and 5. // The input registers for PseudoCCAND/OR/XOR are 4, 5, and 6. + // The input registers for MERGE/MVM/MVMN are 1, 2, and 3. // The input registers for others are operand 1 and 2. unsigned B = 1, E = 3, D = 1; switch (MI->getOpcode()) { @@ -609,7 +613,13 @@ static bool isSignExtendedW(Register SrcReg, const RISCVSubtarget &ST, B = 4; E = 7; break; - } + case RISCV::MERGE: + case RISCV::MVM: + case RISCV::MVMN: + B = 1; + E = 4; + break; + } for (unsigned I = B; I != E; I += D) { if (!MI->getOperand(I).isReg()) diff --git a/llvm/test/CodeGen/RISCV/opt-w-instrs-p-ext.mir b/llvm/test/CodeGen/RISCV/opt-w-instrs-p-ext.mir new file mode 100644 index 000000000000..b832b89bb0c1 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/opt-w-instrs-p-ext.mir @@ -0,0 +1,119 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3 +# RUN: llc -mtriple=riscv64 -mattr=+experimental-p -verify-machineinstrs -run-pass=riscv-opt-w-instrs %s -o - | FileCheck %s + +--- +name: merge_sextw_removed +tracksRegLiveness: true +body: | + bb.0.entry: + liveins: $x10, $x11, $x12 + + ; CHECK-LABEL: name: merge_sextw_removed + ; CHECK: liveins: $x10, $x11, $x12 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr = COPY $x12 + ; CHECK-NEXT: [[ADDW:%[0-9]+]]:gpr = ADDW [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ADDW1:%[0-9]+]]:gpr = ADDW [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[ADDW2:%[0-9]+]]:gpr = ADDW [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[MERGE:%[0-9]+]]:gpr = MERGE [[ADDW]], [[ADDW1]], [[ADDW2]] + ; CHECK-NEXT: $x10 = COPY [[MERGE]] + ; CHECK-NEXT: PseudoRET + %0:gpr = COPY $x10 + %1:gpr = COPY $x11 + %2:gpr = COPY $x12 + ; ADDW produces sign-extended results + %3:gpr = ADDW %0, %1 + %4:gpr = ADDW %1, %2 + %5:gpr = ADDW %0, %2 + %6:gpr = MERGE %3, %4, %5 + %7:gpr = ADDIW %6, 0 + $x10 = COPY %7 + PseudoRET +... +--- +name: mvm_sextw_removed +tracksRegLiveness: true +body: | + bb.0.entry: + liveins: $x10, $x11, $x12 + + ; CHECK-LABEL: name: mvm_sextw_removed + ; CHECK: liveins: $x10, $x11, $x12 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr = COPY $x12 + ; CHECK-NEXT: [[ADDW:%[0-9]+]]:gpr = ADDW [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ADDW1:%[0-9]+]]:gpr = ADDW [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[ADDW2:%[0-9]+]]:gpr = ADDW [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[MVM:%[0-9]+]]:gpr = MVM [[ADDW]], [[ADDW1]], [[ADDW2]] + ; CHECK-NEXT: $x10 = COPY [[MVM]] + ; CHECK-NEXT: PseudoRET + %0:gpr = COPY $x10 + %1:gpr = COPY $x11 + %2:gpr = COPY $x12 + %3:gpr = ADDW %0, %1 + %4:gpr = ADDW %1, %2 + %5:gpr = ADDW %0, %2 + %6:gpr = MVM %3, %4, %5 + %7:gpr = ADDIW %6, 0 + $x10 = COPY %7 + PseudoRET +... +--- +name: mvmn_sextw_removed +tracksRegLiveness: true +body: | + bb.0.entry: + liveins: $x10, $x11, $x12 + + ; CHECK-LABEL: name: mvmn_sextw_removed + ; CHECK: liveins: $x10, $x11, $x12 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr = COPY $x12 + ; CHECK-NEXT: [[ADDW:%[0-9]+]]:gpr = ADDW [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ADDW1:%[0-9]+]]:gpr = ADDW [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[ADDW2:%[0-9]+]]:gpr = ADDW [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[MVMN:%[0-9]+]]:gpr = MVMN [[ADDW]], [[ADDW1]], [[ADDW2]] + ; CHECK-NEXT: $x10 = COPY [[MVMN]] + ; CHECK-NEXT: PseudoRET + %0:gpr = COPY $x10 + %1:gpr = COPY $x11 + %2:gpr = COPY $x12 + %3:gpr = ADDW %0, %1 + %4:gpr = ADDW %1, %2 + %5:gpr = ADDW %0, %2 + %6:gpr = MVMN %3, %4, %5 + %7:gpr = ADDIW %6, 0 + $x10 = COPY %7 + PseudoRET +... +--- +name: merge_sextw_not_removed +tracksRegLiveness: true +body: | + bb.0.entry: + liveins: $x10, $x11, $x12 + + ; CHECK-LABEL: name: merge_sextw_not_removed + ; CHECK: liveins: $x10, $x11, $x12 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr = COPY $x12 + ; CHECK-NEXT: [[MERGE:%[0-9]+]]:gpr = MERGE [[COPY]], [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[ADDIW:%[0-9]+]]:gpr = ADDIW [[MERGE]], 0 + ; CHECK-NEXT: $x10 = COPY [[ADDIW]] + ; CHECK-NEXT: PseudoRET + %0:gpr = COPY $x10 + %1:gpr = COPY $x11 + %2:gpr = COPY $x12 + %3:gpr = MERGE %0, %1, %2 + %4:gpr = ADDIW %3, 0 + $x10 = COPY %4 + PseudoRET +...