Skip to content

Commit d2515dd

Browse files
committed
[RISCV] Add hasSideEffects = true to ReadFRM
ReadFRM should not be optimized out.
1 parent 9b1a037 commit d2515dd

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2006,7 +2006,9 @@ class SwapSysRegImm<SysReg SR, list<Register> Regs>
20062006
let Defs = Regs;
20072007
}
20082008

2009+
let hasSideEffects = true in
20092010
def ReadFRM : ReadSysReg<SysRegFRM, [FRM]>;
2011+
20102012
let hasPostISelHook = 1 in {
20112013
def WriteFRM : WriteSysReg<SysRegFRM, [FRM]>;
20122014
def WriteFRMImm : WriteSysRegImm<SysRegFRM, [FRM]>;

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() {
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() {
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)