Skip to content

Commit e3b167c

Browse files
authored
[RISCV] Implement RISCVTargetLowering::getRoundingControlRegisters (#139864)
By adding FRM/FFLAGS as implicit defs, ReadFRM is not optimized out.
1 parent 114e450 commit e3b167c

File tree

3 files changed

+38
-16
lines changed

3 files changed

+38
-16
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24509,3 +24509,11 @@ RISCVTargetLowering::emitDynamicProbedAlloc(MachineInstr &MI,
2450924509
MF.getInfo<RISCVMachineFunctionInfo>()->setDynamicAllocation();
2451024510
return ExitMBB->begin()->getParent();
2451124511
}
24512+
24513+
ArrayRef<MCPhysReg> RISCVTargetLowering::getRoundingControlRegisters() const {
24514+
if (Subtarget.hasStdExtFOrZfinx()) {
24515+
static const MCPhysReg RCRegs[] = {RISCV::FRM, RISCV::FFLAGS};
24516+
return RCRegs;
24517+
}
24518+
return {};
24519+
}

llvm/lib/Target/RISCV/RISCVISelLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,8 @@ class RISCVTargetLowering : public TargetLowering {
450450
MachineBasicBlock *emitDynamicProbedAlloc(MachineInstr &MI,
451451
MachineBasicBlock *MBB) const;
452452

453+
ArrayRef<MCPhysReg> getRoundingControlRegisters() const override;
454+
453455
private:
454456
void analyzeInputArgs(MachineFunction &MF, CCState &CCInfo,
455457
const SmallVectorImpl<ISD::InputArg> &Ins, bool IsRet,

llvm/test/CodeGen/RISCV/fpenv.ll

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,22 @@ define i1 @test_get_rounding_sideeffect() #0 {
4040
; RV32IF-NEXT: frrm a0
4141
; RV32IF-NEXT: lui a1, 66
4242
; RV32IF-NEXT: slli a0, a0, 2
43-
; RV32IF-NEXT: addi a1, a1, 769
44-
; RV32IF-NEXT: srl s0, a1, a0
43+
; RV32IF-NEXT: addi s0, a1, 769
44+
; RV32IF-NEXT: srl a0, s0, a0
45+
; RV32IF-NEXT: andi a0, a0, 7
46+
; RV32IF-NEXT: beqz a0, .LBB1_2
47+
; RV32IF-NEXT: # %bb.1:
4548
; RV32IF-NEXT: li a0, 0
46-
; RV32IF-NEXT: andi s0, s0, 7
47-
; RV32IF-NEXT: bnez s0, .LBB1_2
48-
; RV32IF-NEXT: # %bb.1: # %if.end
49+
; RV32IF-NEXT: j .LBB1_3
50+
; RV32IF-NEXT: .LBB1_2: # %if.end
4951
; RV32IF-NEXT: call fesetround
50-
; RV32IF-NEXT: addi s0, s0, -1
51-
; RV32IF-NEXT: seqz a0, s0
52-
; RV32IF-NEXT: .LBB1_2: # %return
52+
; RV32IF-NEXT: frrm a0
53+
; RV32IF-NEXT: slli a0, a0, 2
54+
; RV32IF-NEXT: srl a0, s0, a0
55+
; RV32IF-NEXT: andi a0, a0, 7
56+
; RV32IF-NEXT: addi a0, a0, -1
57+
; RV32IF-NEXT: seqz a0, a0
58+
; RV32IF-NEXT: .LBB1_3: # %return
5359
; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
5460
; RV32IF-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
5561
; RV32IF-NEXT: .cfi_restore ra
@@ -71,16 +77,22 @@ define i1 @test_get_rounding_sideeffect() #0 {
7177
; RV64IF-NEXT: frrm a0
7278
; RV64IF-NEXT: lui a1, 66
7379
; RV64IF-NEXT: slli a0, a0, 2
74-
; RV64IF-NEXT: addiw a1, a1, 769
75-
; RV64IF-NEXT: srl s0, a1, a0
80+
; RV64IF-NEXT: addiw s0, a1, 769
81+
; RV64IF-NEXT: srl a0, s0, a0
82+
; RV64IF-NEXT: andi a0, a0, 7
83+
; RV64IF-NEXT: beqz a0, .LBB1_2
84+
; RV64IF-NEXT: # %bb.1:
7685
; RV64IF-NEXT: li a0, 0
77-
; RV64IF-NEXT: andi s0, s0, 7
78-
; RV64IF-NEXT: bnez s0, .LBB1_2
79-
; RV64IF-NEXT: # %bb.1: # %if.end
86+
; RV64IF-NEXT: j .LBB1_3
87+
; RV64IF-NEXT: .LBB1_2: # %if.end
8088
; RV64IF-NEXT: call fesetround
81-
; RV64IF-NEXT: addi s0, s0, -1
82-
; RV64IF-NEXT: seqz a0, s0
83-
; RV64IF-NEXT: .LBB1_2: # %return
89+
; RV64IF-NEXT: frrm a0
90+
; RV64IF-NEXT: slli a0, a0, 2
91+
; RV64IF-NEXT: srl a0, s0, a0
92+
; RV64IF-NEXT: andi a0, a0, 7
93+
; RV64IF-NEXT: addi a0, a0, -1
94+
; RV64IF-NEXT: seqz a0, a0
95+
; RV64IF-NEXT: .LBB1_3: # %return
8496
; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
8597
; RV64IF-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
8698
; RV64IF-NEXT: .cfi_restore ra

0 commit comments

Comments
 (0)