diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index 966cdc433d0fd..fd8777fdc121c 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -1259,6 +1259,10 @@ def or_is_add : PatFrag<(ops node:$lhs, node:$rhs), (or node:$lhs, node:$rhs),[{ }]>; def : PatGprSimm12; +def add_like : PatFrags<(ops node:$lhs, node:$rhs), + [(or_is_add node:$lhs, node:$rhs), + (add node:$lhs, node:$rhs)]>; + // negate of low bit can be done via two (compressible) shifts. The negate // is never compressible since rs1 and rd can't be the same register. def : Pat<(XLenVT (sub 0, (and_oneuse GPR:$rs, 1))), diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td index a882b208a7688..549bc039fabbc 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td @@ -255,7 +255,7 @@ class binop_with_non_imm12 }]; } def add_non_imm12 : binop_with_non_imm12; -def or_is_add_non_imm12 : binop_with_non_imm12; +def add_like_non_imm12 : binop_with_non_imm12; def Shifted32OnesMask : IntImmLeaf; -def : Pat<(i64 (add_non_imm12 (and GPR:$rs1, 0xFFFFFFFF), GPR:$rs2)), +def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFFF), GPR:$rs2)), (ADD_UW GPR:$rs1, GPR:$rs2)>; def : Pat<(i64 (and GPR:$rs, 0xFFFFFFFF)), (ADD_UW GPR:$rs, (XLenVT X0))>; -def : Pat<(i64 (or_is_add_non_imm12 (and GPR:$rs1, 0xFFFFFFFF), GPR:$rs2)), - (ADD_UW GPR:$rs1, GPR:$rs2)>; - foreach i = {1,2,3} in { defvar shxadd_uw = !cast("SH"#i#"ADD_UW"); def : Pat<(i64 (add_non_imm12 (shl (and GPR:$rs1, 0xFFFFFFFF), (i64 i)), (XLenVT GPR:$rs2))), @@ -876,13 +873,10 @@ let Predicates = [HasStdExtZba, IsRV64] in { def : Pat<(shl (i64 (zext i32:$rs1)), uimm5:$shamt), (SLLI_UW GPR:$rs1, uimm5:$shamt)>; -def : Pat<(i64 (add_non_imm12 (zext GPR:$rs1), GPR:$rs2)), +def : Pat<(i64 (add_like_non_imm12 (zext GPR:$rs1), GPR:$rs2)), (ADD_UW GPR:$rs1, GPR:$rs2)>; def : Pat<(zext GPR:$src), (ADD_UW GPR:$src, (XLenVT X0))>; -def : Pat<(i64 (or_is_add_non_imm12 (zext GPR:$rs1), GPR:$rs2)), - (ADD_UW GPR:$rs1, GPR:$rs2)>; - foreach i = {1,2,3} in { defvar shxadd = !cast("SH"#i#"ADD"); def : Pat<(i32 (add_non_imm12 (shl GPR:$rs1, (i64 i)), GPR:$rs2)),