Skip to content

Commit ad551c1

Browse files
committed
[LoongArch] Fixed llvm/test/CodeGen/LoongArch/intrinsic.ll test failure when EXPENSIV_CHECK is enabled [1].
Specifically: ``` *** Bad machine code: Using an undefined physical register *** - function: movgr2fcsr - basic block: %bb.0 entry (0x1af5e60) - instruction: MOVGR2FCSR $fcsr1, %0:gpr - operand 0: $fcsr1 *** Bad machine code: Using an undefined physical register *** - function: movfcsr2gr - basic block: %bb.0 entry (0x133fae0) - instruction: %0:gpr = MOVFCSR2GR $fcsr1 - operand 1: $fcsr1 ``` By building MachineInstructions, the state of the register is clarified, and the error caused by using undefined physical registers is fixed. [1]: https://lab.llvm.org/buildbot/#/builders/16/builds/41677
1 parent 402f900 commit ad551c1

File tree

4 files changed

+37
-20
lines changed

4 files changed

+37
-20
lines changed

llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@ def FSEL_S : FP_SEL<0b00001101000000, "fsel", FPR32>;
9898
def FMOV_S : FP_MOV<0b0000000100010100100101, "fmov.s", FPR32, FPR32>;
9999
def MOVGR2FR_W : FP_MOV<0b0000000100010100101001, "movgr2fr.w", FPR32, GPR>;
100100
def MOVFR2GR_S : FP_MOV<0b0000000100010100101101, "movfr2gr.s", GPR, FPR32>;
101-
def MOVGR2FCSR : FPFmtMOV<0b0000000100010100110000, (outs), (ins FCSR:$dst, GPR:$src),
102-
"movgr2fcsr", "$dst, $src">;
101+
def MOVGR2FCSR : FP_MOV<0b0000000100010100110000, "movgr2fcsr", FCSR, GPR>;
103102
def MOVFCSR2GR : FP_MOV<0b0000000100010100110010, "movfcsr2gr", GPR, FCSR>;
104103
def MOVFR2CF_S : FP_MOV<0b0000000100010100110100, "movfr2cf", CFR, FPR32>;
105104
def MOVCF2FR_S : FP_MOV<0b0000000100010100110101, "movcf2fr", FPR32, CFR>;

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ LoongArchTargetLowering::lowerINTRINSIC_W_CHAIN(SDValue Op,
722722
}
723723
return DAG.getMergeValues(
724724
{DAG.getNode(LoongArchISD::MOVFCSR2GR, DL, Op.getValueType(),
725-
DAG.getRegister(LoongArch::FCSR0 + Imm, MVT::i32)),
725+
DAG.getConstant(Imm, DL, GRLenVT)),
726726
Op.getOperand(0)},
727727
DL);
728728
}
@@ -812,7 +812,7 @@ SDValue LoongArchTargetLowering::lowerINTRINSIC_VOID(SDValue Op,
812812

813813
return DAG.getNode(
814814
LoongArchISD::MOVGR2FCSR, DL, MVT::Other, Op0,
815-
DAG.getRegister(LoongArch::FCSR0 + Imm, MVT::i32),
815+
DAG.getConstant(Imm, DL, GRLenVT),
816816
DAG.getNode(ISD::ANY_EXTEND, DL, GRLenVT, Op.getOperand(3)));
817817
}
818818
case Intrinsic::loongarch_syscall: {
@@ -1145,6 +1145,7 @@ void LoongArchTargetLowering::ReplaceNodeResults(
11451145
SDValue Op0 = N->getOperand(0);
11461146
EVT VT = N->getValueType(0);
11471147
uint64_t Op1 = N->getConstantOperandVal(1);
1148+
MVT GRLenVT = Subtarget.getGRLenVT();
11481149
if (Op1 == Intrinsic::loongarch_movfcsr2gr) {
11491150
if (!Subtarget.hasBasicF()) {
11501151
DAG.getContext()->emitError(
@@ -1163,15 +1164,14 @@ void LoongArchTargetLowering::ReplaceNodeResults(
11631164
Results.push_back(N->getOperand(0));
11641165
return;
11651166
}
1166-
Results.push_back(DAG.getNode(
1167-
ISD::TRUNCATE, DL, VT,
1168-
DAG.getNode(LoongArchISD::MOVFCSR2GR, SDLoc(N), MVT::i64,
1169-
DAG.getRegister(LoongArch::FCSR0 + Imm, MVT::i32))));
1167+
Results.push_back(
1168+
DAG.getNode(ISD::TRUNCATE, DL, VT,
1169+
DAG.getNode(LoongArchISD::MOVFCSR2GR, SDLoc(N), MVT::i64,
1170+
DAG.getConstant(Imm, DL, GRLenVT))));
11701171
Results.push_back(N->getOperand(0));
11711172
return;
11721173
}
11731174
SDValue Op2 = N->getOperand(2);
1174-
MVT GRLenVT = Subtarget.getGRLenVT();
11751175
std::string Name = N->getOperationName(0);
11761176

11771177
switch (Op1) {
@@ -1729,6 +1729,8 @@ static MachineBasicBlock *insertDivByZeroTrap(MachineInstr &MI,
17291729

17301730
MachineBasicBlock *LoongArchTargetLowering::EmitInstrWithCustomInserter(
17311731
MachineInstr &MI, MachineBasicBlock *BB) const {
1732+
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
1733+
DebugLoc DL = MI.getDebugLoc();
17321734

17331735
switch (MI.getOpcode()) {
17341736
default:
@@ -1743,6 +1745,22 @@ MachineBasicBlock *LoongArchTargetLowering::EmitInstrWithCustomInserter(
17431745
case LoongArch::MOD_DU:
17441746
return insertDivByZeroTrap(MI, BB);
17451747
break;
1748+
case LoongArch::WRFCSR: {
1749+
BuildMI(*BB, MI, DL, TII->get(LoongArch::MOVGR2FCSR),
1750+
LoongArch::FCSR0 + MI.getOperand(0).getImm())
1751+
.addReg(MI.getOperand(1).getReg());
1752+
MI.eraseFromParent();
1753+
return BB;
1754+
}
1755+
case LoongArch::RDFCSR: {
1756+
MachineInstr *ReadFCSR =
1757+
BuildMI(*BB, MI, DL, TII->get(LoongArch::MOVFCSR2GR),
1758+
MI.getOperand(0).getReg())
1759+
.addReg(LoongArch::FCSR0 + MI.getOperand(1).getImm());
1760+
ReadFCSR->getOperand(1).setIsUndef();
1761+
MI.eraseFromParent();
1762+
return BB;
1763+
}
17461764
}
17471765
}
17481766

llvm/lib/Target/LoongArch/LoongArchInstrInfo.td

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ def SDT_LoongArchCsrxchg : SDTypeProfile<1, 3, [SDTCisInt<0>,
4848
SDTCisVT<3, GRLenVT>]>;
4949
def SDT_LoongArchIocsrwr : SDTypeProfile<0, 2, [SDTCisInt<0>,
5050
SDTCisSameAs<0, 1>]>;
51-
def SDT_LoongArchMovgr2fcsr : SDTypeProfile<0, 2, [SDTCisVT<0, i32>,
52-
SDTCisVT<1, GRLenVT>]>;
51+
def SDT_LoongArchMovgr2fcsr : SDTypeProfile<0, 2, [SDTCisVT<0, GRLenVT>,
52+
SDTCisSameAs<0, 1>]>;
5353
def SDT_LoongArchMovfcsr2gr : SDTypeProfile<1, 1, [SDTCisVT<0, GRLenVT>,
54-
SDTCisVT<1, i32>]>;
54+
SDTCisSameAs<0, 1>]>;
5555

5656
// TODO: Add LoongArch specific DAG Nodes
5757
// Target-independent nodes, but with target-specific formats.
@@ -180,7 +180,7 @@ def imm32 : Operand<GRLenVT> {
180180
let ParserMatchClass = ImmAsmOperand<"", 32, "">;
181181
}
182182

183-
def uimm2 : Operand<GRLenVT> {
183+
def uimm2 : Operand<GRLenVT>, ImmLeaf<GRLenVT, [{return isUInt<2>(Imm);}]> {
184184
let ParserMatchClass = UImmAsmOperand<2>;
185185
}
186186

@@ -1647,11 +1647,11 @@ def PseudoLI_D : Pseudo<(outs GPR:$rd), (ins grlenimm:$imm), [],
16471647
include "LoongArchFloat32InstrInfo.td"
16481648
include "LoongArchFloat64InstrInfo.td"
16491649

1650-
let Predicates = [HasBasicF] in {
1651-
def : Pat<(loongarch_movfcsr2gr i32:$fcsr),
1652-
(MOVFCSR2GR FCSR:$fcsr)>;
1653-
def : Pat<(loongarch_movgr2fcsr i32:$fcsr, GRLenVT:$rj),
1654-
(MOVGR2FCSR FCSR:$fcsr, GPR:$rj)>;
1650+
let Predicates = [HasBasicF], usesCustomInserter = 1 in {
1651+
def WRFCSR : Pseudo<(outs), (ins uimm2:$fcsr, GPR:$src),
1652+
[(loongarch_movgr2fcsr uimm2:$fcsr, GRLenVT:$src)]>;
1653+
def RDFCSR : Pseudo<(outs GPR:$rd), (ins uimm2:$fcsr),
1654+
[(set GPR:$rd, (loongarch_movfcsr2gr uimm2:$fcsr))]>;
16551655
}
16561656

16571657
//===----------------------------------------------------------------------===//

llvm/test/CodeGen/LoongArch/intrinsic.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc --mtriple=loongarch32 --mattr=+f < %s | FileCheck %s
3-
; RUN: llc --mtriple=loongarch64 --mattr=+f < %s | FileCheck %s
2+
; RUN: llc --mtriple=loongarch32 --mattr=+f --verify-machineinstrs < %s | FileCheck %s
3+
; RUN: llc --mtriple=loongarch64 --mattr=+f --verify-machineinstrs < %s | FileCheck %s
44

55
declare void @llvm.loongarch.dbar(i32)
66
declare void @llvm.loongarch.ibar(i32)

0 commit comments

Comments
 (0)