diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.h b/llvm/lib/Target/RISCV/RISCVISelLowering.h --- a/llvm/lib/Target/RISCV/RISCVISelLowering.h +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.h @@ -26,7 +26,6 @@ enum NodeType : unsigned { FIRST_NUMBER = ISD::BUILTIN_OP_END, RET_FLAG, - URET_FLAG, SRET_FLAG, MRET_FLAG, CALL, diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -9077,7 +9077,7 @@ StringRef Kind = MF.getFunction().getFnAttribute("interrupt").getValueAsString(); - if (!(Kind == "user" || Kind == "supervisor" || Kind == "machine")) + if (!(Kind == "supervisor" || Kind == "machine")) report_fatal_error( "Function interrupt attribute argument not supported!"); } @@ -9694,9 +9694,7 @@ StringRef Kind = MF.getFunction().getFnAttribute("interrupt").getValueAsString(); - if (Kind == "user") - RetOpc = RISCVISD::URET_FLAG; - else if (Kind == "supervisor") + if (Kind == "supervisor") RetOpc = RISCVISD::SRET_FLAG; else RetOpc = RISCVISD::MRET_FLAG; @@ -9731,7 +9729,6 @@ case RISCVISD::FIRST_NUMBER: break; NODE_NAME_CASE(RET_FLAG) - NODE_NAME_CASE(URET_FLAG) NODE_NAME_CASE(SRET_FLAG) NODE_NAME_CASE(MRET_FLAG) NODE_NAME_CASE(CALL) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -57,8 +57,6 @@ SDNPVariadic]>; def riscv_ret_flag : SDNode<"RISCVISD::RET_FLAG", SDTNone, [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; -def riscv_uret_flag : SDNode<"RISCVISD::URET_FLAG", SDTNone, - [SDNPHasChain, SDNPOptInGlue]>; def riscv_sret_flag : SDNode<"RISCVISD::SRET_FLAG", SDTNone, [SDNPHasChain, SDNPOptInGlue]>; def riscv_mret_flag : SDNode<"RISCVISD::MRET_FLAG", SDTNone, @@ -659,12 +657,6 @@ //===----------------------------------------------------------------------===// let isBarrier = 1, isReturn = 1, isTerminator = 1 in { -def URET : Priv<"uret", 0b0000000>, Sched<[]> { - let rd = 0; - let rs1 = 0; - let rs2 = 0b00010; -} - def SRET : Priv<"sret", 0b0001000>, Sched<[]> { let rd = 0; let rs1 = 0; @@ -1203,7 +1195,6 @@ def : Pat<(riscv_call tglobaladdr:$func), (PseudoCALL tglobaladdr:$func)>; def : Pat<(riscv_call texternalsym:$func), (PseudoCALL texternalsym:$func)>; -def : Pat<(riscv_uret_flag), (URET X0, X0)>; def : Pat<(riscv_sret_flag), (SRET X0, X0)>; def : Pat<(riscv_mret_flag), (MRET X0, X0)>; diff --git a/llvm/lib/Target/RISCV/RISCVSystemOperands.td b/llvm/lib/Target/RISCV/RISCVSystemOperands.td --- a/llvm/lib/Target/RISCV/RISCVSystemOperands.td +++ b/llvm/lib/Target/RISCV/RISCVSystemOperands.td @@ -70,23 +70,6 @@ // 2.3, 2.4 and 2.5 in the RISC-V Instruction Set Manual // Volume II: Privileged Architecture. -//===----------------------------------------------------------------------===// -// User Trap Setup -//===----------------------------------------------------------------------===// -def : SysReg<"ustatus", 0x000>; -def : SysReg<"uie", 0x004>; -def : SysReg<"utvec", 0x005>; - -//===----------------------------------------------------------------------===// -// User Trap Handling -//===----------------------------------------------------------------------===// -def : SysReg<"uscratch", 0x040>; -def : SysReg<"uepc", 0x041>; -def : SysReg<"ucause", 0x042>; -let DeprecatedName = "ubadaddr" in -def : SysReg<"utval", 0x043>; -def : SysReg<"uip", 0x044>; - //===----------------------------------------------------------------------===// // User Floating-Point CSRs //===----------------------------------------------------------------------===// diff --git a/llvm/test/CodeGen/RISCV/interrupt-attr-args-error.ll b/llvm/test/CodeGen/RISCV/interrupt-attr-args-error.ll --- a/llvm/test/CodeGen/RISCV/interrupt-attr-args-error.ll +++ b/llvm/test/CodeGen/RISCV/interrupt-attr-args-error.ll @@ -4,8 +4,8 @@ ; RUN: 2>&1 | FileCheck %s ; CHECK: LLVM ERROR: Functions with the interrupt attribute cannot have arguments! -define i32 @isr_user(i8 %n) #0 { +define i32 @isr_supervisor(i8 %n) #0 { ret i32 0 } -attributes #0 = { "interrupt"="user" } +attributes #0 = { "interrupt"="supervisor" } diff --git a/llvm/test/CodeGen/RISCV/interrupt-attr-ret-error.ll b/llvm/test/CodeGen/RISCV/interrupt-attr-ret-error.ll --- a/llvm/test/CodeGen/RISCV/interrupt-attr-ret-error.ll +++ b/llvm/test/CodeGen/RISCV/interrupt-attr-ret-error.ll @@ -4,9 +4,9 @@ ; RUN: 2>&1 | FileCheck %s ; CHECK: LLVM ERROR: Functions with the interrupt attribute must have void return type! -define i32 @isr1_user() #0 { +define i32 @isr1_supervisor() #0 { ret i32 0 } -attributes #0 = { "interrupt"="user" } +attributes #0 = { "interrupt"="supervisor" } diff --git a/llvm/test/CodeGen/RISCV/interrupt-attr.ll b/llvm/test/CodeGen/RISCV/interrupt-attr.ll --- a/llvm/test/CodeGen/RISCV/interrupt-attr.ll +++ b/llvm/test/CodeGen/RISCV/interrupt-attr.ll @@ -16,21 +16,15 @@ ; ; Checking for special return instructions (uret, sret, mret). ; -define void @foo_user() #0 { -; CHECK-LABEL: foo_user: -; CHECK: # %bb.0: -; CHECK-NEXT: uret - ret void -} -define void @foo_supervisor() #1 { +define void @foo_supervisor() #0 { ; CHECK-LABEL: foo_supervisor: ; CHECK: # %bb.0: ; CHECK-NEXT: sret ret void } -define void @foo_machine() #2 { +define void @foo_machine() #1 { ; CHECK-LABEL: foo_machine: ; CHECK: # %bb.0: ; CHECK-NEXT: mret @@ -49,7 +43,7 @@ ; declare i32 @otherfoo(...) -define void @foo_with_call() #2 { +define void @foo_with_call() #1 { ; ; CHECK-RV32-LABEL: foo_with_call: ; CHECK-RV32: # %bb.0: @@ -547,7 +541,7 @@ ; ; Additionally check frame pointer and return address are properly saved. ; -define void @foo_fp_with_call() #3 { +define void @foo_fp_with_call() #2 { ; ; CHECK-RV32-LABEL: foo_fp_with_call: ; CHECK-RV32: # %bb.0: @@ -1060,7 +1054,6 @@ ret void } -attributes #0 = { nounwind "interrupt"="user" } -attributes #1 = { nounwind "interrupt"="supervisor" } -attributes #2 = { nounwind "interrupt"="machine" } -attributes #3 = { nounwind "interrupt"="machine" "frame-pointer"="all" } +attributes #0 = { nounwind "interrupt"="supervisor" } +attributes #1 = { nounwind "interrupt"="machine" } +attributes #2 = { nounwind "interrupt"="machine" "frame-pointer"="all" } diff --git a/llvm/test/CodeGen/RISCV/saverestore.ll b/llvm/test/CodeGen/RISCV/saverestore.ll --- a/llvm/test/CodeGen/RISCV/saverestore.ll +++ b/llvm/test/CodeGen/RISCV/saverestore.ll @@ -298,33 +298,3 @@ ret void } -; Check that functions with interrupt attribute do not use save/restore code - -declare i32 @foo(...) -define void @interrupt() nounwind "interrupt"="user" { -; RV32I-LABEL: interrupt: -; RV32I-NOT: call t0, __riscv_save -; RV32I-NOT: tail __riscv_restore -; -; RV64I-LABEL: interrupt: -; RV64I-NOT: call t0, __riscv_save -; RV64I-NOT: tail __riscv_restore -; -; RV32I-SR-LABEL: interrupt: -; RV32I-SR-NOT: call t0, __riscv_save -; RV32I-SR-NOT: tail __riscv_restore -; -; RV64I-SR-LABEL: interrupt: -; RV64I-SR-NOT: call t0, __riscv_save -; RV64I-SR-NOT: tail __riscv_restore -; -; RV32I-FP-SR-LABEL: interrupt: -; RV32I-FP-SR-NOT: call t0, __riscv_save -; RV32I-FP-SR-NOT: tail __riscv_restore -; -; RV64I-FP-SR-LABEL: interrupt: -; RV64I-FP-SR-NOT: call t0, __riscv_save -; RV64I-FP-SR-NOT: tail __riscv_restore - %call = call i32 bitcast (i32 (...)* @foo to i32 ()*)() - ret void -} diff --git a/llvm/test/MC/RISCV/deprecated-csr-names.s b/llvm/test/MC/RISCV/deprecated-csr-names.s --- a/llvm/test/MC/RISCV/deprecated-csr-names.s +++ b/llvm/test/MC/RISCV/deprecated-csr-names.s @@ -44,22 +44,6 @@ # CHECK-WARN: warning: 'mbadaddr' is a deprecated alias for 'mtval' -# ubadaddr -# name -# CHECK-INST: csrrw zero, utval, zero -# CHECK-ENC: encoding: [0x73,0x10,0x30,0x04] -# CHECK-INST-ALIAS: csrw utval, zero -# uimm12 -# CHECK-INST: csrrw zero, utval, zero -# CHECK-ENC: encoding: [0x73,0x10,0x30,0x04] -# CHECK-INST-ALIAS: csrw utval, zero -# name -csrw ubadaddr, zero -# uimm12 -csrrw zero, 0x043, zero - -# CHECK-WARN: warning: 'ubadaddr' is a deprecated alias for 'utval' - # sptbr # name # CHECK-INST: csrrw zero, satp, zero diff --git a/llvm/test/MC/RISCV/priv-valid.s b/llvm/test/MC/RISCV/priv-valid.s --- a/llvm/test/MC/RISCV/priv-valid.s +++ b/llvm/test/MC/RISCV/priv-valid.s @@ -9,10 +9,6 @@ # RUN: | llvm-objdump -M no-aliases -d - \ # RUN: | FileCheck -check-prefix=CHECK-INST %s -# CHECK-INST: uret -# CHECK: encoding: [0x73,0x00,0x20,0x00] -uret - # CHECK-INST: sret # CHECK: encoding: [0x73,0x00,0x20,0x10] sret diff --git a/llvm/test/MC/RISCV/rv32e-valid.s b/llvm/test/MC/RISCV/rv32e-valid.s --- a/llvm/test/MC/RISCV/rv32e-valid.s +++ b/llvm/test/MC/RISCV/rv32e-valid.s @@ -111,10 +111,6 @@ csrrs s0, 0xc00, x0 # CHECK-ASM-AND-OBJ: csrrs s0, fflags, a5 csrrs s0, 0x001, a5 -# CHECK-ASM-AND-OBJ: csrrc sp, ustatus, ra -csrrc sp, 0x000, ra -# CHECK-ASM-AND-OBJ: csrrwi a5, ustatus, 0 -csrrwi a5, 0x000, 0 # CHECK-ASM-AND-OBJ: csrrsi t2, 4095, 31 csrrsi t2, 0xfff, 31 # CHECK-ASM-AND-OBJ: csrrci t1, sscratch, 5 diff --git a/llvm/test/MC/RISCV/rv32i-valid.s b/llvm/test/MC/RISCV/rv32i-valid.s --- a/llvm/test/MC/RISCV/rv32i-valid.s +++ b/llvm/test/MC/RISCV/rv32i-valid.s @@ -361,12 +361,6 @@ # CHECK-ASM-AND-OBJ: csrrs s3, fflags, s5 # CHECK-ASM: encoding: [0xf3,0xa9,0x1a,0x00] csrrs s3, 0x001, s5 -# CHECK-ASM-AND-OBJ: csrrc sp, ustatus, ra -# CHECK-ASM: encoding: [0x73,0xb1,0x00,0x00] -csrrc sp, 0x000, ra -# CHECK-ASM-AND-OBJ: csrrwi a5, ustatus, 0 -# CHECK-ASM: encoding: [0xf3,0x57,0x00,0x00] -csrrwi a5, 0x000, 0 # CHECK-ASM-AND-OBJ: csrrsi t2, 4095, 31 # CHECK-ASM: encoding: [0xf3,0xe3,0xff,0xff] csrrsi t2, 0xfff, 31 diff --git a/llvm/test/MC/RISCV/user-csr-names.s b/llvm/test/MC/RISCV/user-csr-names.s --- a/llvm/test/MC/RISCV/user-csr-names.s +++ b/llvm/test/MC/RISCV/user-csr-names.s @@ -10,125 +10,6 @@ # RUN: | llvm-objdump -d - \ # RUN: | FileCheck -check-prefix=CHECK-INST-ALIAS %s -################################## -# User Trap Setup -################################## - -# ustatus -# name -# CHECK-INST: csrrs t1, ustatus, zero -# CHECK-ENC: encoding: [0x73,0x23,0x00,0x00] -# CHECK-INST-ALIAS: csrr t1, ustatus -# uimm12 -# CHECK-INST: csrrs t2, ustatus, zero -# CHECK-ENC: encoding: [0xf3,0x23,0x00,0x00] -# CHECK-INST-ALIAS: csrr t2, ustatus -csrrs t1, ustatus, zero -# uimm12 -csrrs t2, 0x000, zero - -# uie -# name -# CHECK-INST: csrrs t1, uie, zero -# CHECK-ENC: encoding: [0x73,0x23,0x40,0x00] -# CHECK-INST-ALIAS: csrr t1, uie -# uimm12 -# CHECK-INST: csrrs t2, uie, zero -# CHECK-ENC: encoding: [0xf3,0x23,0x40,0x00] -# CHECK-INST-ALIAS: csrr t2, uie -# name -csrrs t1, uie, zero -# uimm12 -csrrs t2, 0x004, zero - -# utvec -# name -# CHECK-INST: csrrs t1, utvec, zero -# CHECK-ENC: encoding: [0x73,0x23,0x50,0x00] -# CHECK-INST-ALIAS: csrr t1, utvec -# uimm12 -# CHECK-INST: csrrs t2, utvec, zero -# CHECK-ENC: encoding: [0xf3,0x23,0x50,0x00] -# CHECK-INST-ALIAS: csrr t2, utvec -# name -csrrs t1, utvec, zero -# uimm12 -csrrs t2, 0x005, zero - -################################## -# User Trap Handling -################################## - -# uscratch -# name -# CHECK-INST: csrrs t1, uscratch, zero -# CHECK-ENC: encoding: [0x73,0x23,0x00,0x04] -# CHECK-INST-ALIAS: csrr t1, uscratch -# uimm12 -# CHECK-INST: csrrs t2, uscratch, zero -# CHECK-ENC: encoding: [0xf3,0x23,0x00,0x04] -# CHECK-INST-ALIAS: csrr t2, uscratch -# name -csrrs t1, uscratch, zero -# uimm12 -csrrs t2, 0x040, zero - -# uepc -# name -# CHECK-INST: csrrs t1, uepc, zero -# CHECK-ENC: encoding: [0x73,0x23,0x10,0x04] -# CHECK-INST-ALIAS: csrr t1, uepc -# uimm12 -# CHECK-INST: csrrs t2, uepc, zero -# CHECK-ENC: encoding: [0xf3,0x23,0x10,0x04] -# CHECK-INST-ALIAS: csrr t2, uepc -# name -csrrs t1, uepc, zero -# uimm12 -csrrs t2, 0x041, zero - -# ucause -# name -# CHECK-INST: csrrs t1, ucause, zero -# CHECK-ENC: encoding: [0x73,0x23,0x20,0x04] -# CHECK-INST-ALIAS: csrr t1, ucause -# uimm12 -# CHECK-INST: csrrs t2, ucause, zero -# CHECK-ENC: encoding: [0xf3,0x23,0x20,0x04] -# CHECK-INST-ALIAS: csrr t2, ucause -# name -csrrs t1, ucause, zero -# uimm12 -csrrs t2, 0x042, zero - -# utval -# name -# CHECK-INST: csrrs t1, utval, zero -# CHECK-ENC: encoding: [0x73,0x23,0x30,0x04] -# CHECK-INST-ALIAS: csrr t1, utval -# uimm12 -# CHECK-INST: csrrs t2, utval, zero -# CHECK-ENC: encoding: [0xf3,0x23,0x30,0x04] -# CHECK-INST-ALIAS: csrr t2, utval -# name -csrrs t1, utval, zero -# uimm12 -csrrs t2, 0x043, zero - -# uip -# name -# CHECK-INST: csrrs t1, uip, zero -# CHECK-ENC: encoding: [0x73,0x23,0x40,0x04] -# CHECK-INST-ALIAS: csrr t1, uip -# uimm12 -# CHECK-INST: csrrs t2, uip, zero -# CHECK-ENC: encoding: [0xf3,0x23,0x40,0x04] -# CHECK-INST-ALIAS: csrr t2, uip -#name -csrrs t1, uip, zero -# uimm12 -csrrs t2, 0x044, zero - ################################## # User Floating Pont CSRs ##################################