[llvm] [RISCV] Add macro fusion support for spacemit-x100 (PR #178594)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 28 22:08:51 PST 2026
================
@@ -147,3 +155,118 @@ def TuneSHXADDLoadFusion
"Enable SH(1|2|3)ADD(.UW) + load macrofusion",
CheckOpcode<[SH1ADD, SH2ADD, SH3ADD, SH1ADD_UW, SH2ADD_UW, SH3ADD_UW]>,
CheckOpcode<Load>>;
+
+// Fuse logic operation followed by another logic operation:
+// and/or/xor rd, rs1, rs2
+// and/or/xor rd, rd, rs3
+let IsCommutable = 1 in
+def TuneLogicRegRegFusion
+ : SimpleFusion<"logic-reg-reg-fusion", "HasLogicRegRegFusion",
+ "Enable AND/OR/XOR+AND/OR/XOR macrofusion",
+ CheckOpcode<LogicOp>,
+ CheckOpcode<LogicOp>>;
+
+// Fuse logic operation followed by logic immediate operation:
+// and/or/xor rd, rs1, rs2
+// andi/ori/xori rd, rd, imm
+def TuneLogicRegImmFusion
+ : SimpleFusion<"logic-reg-imm-fusion", "HasLogicRegImmFusion",
+ "Enable AND/OR/XOR+ANDI/ORI/XORI macrofusion",
+ CheckOpcode<LogicOp>,
+ CheckOpcode<LogicImmOp>>;
+
+// Fuse logic immediate operation followed by logic operation:
+// andi/ori/xori rd, rs1, imm
+// and/or/xor rd, rd, rs2
+let IsCommutable = 1 in
+def TuneLogicImmRegFusion
+ : SimpleFusion<"logic-imm-reg-fusion", "HasLogicImmRegFusion",
+ "Enable ANDI/ORI/XORI+AND/OR/XOR macrofusion",
+ CheckOpcode<LogicImmOp>,
+ CheckOpcode<LogicOp>>;
+
+// Fuse multiply followed by add:
+// mul(w) rd, rs1, rs2
+// add(w) rd, rd, rs3
+def TuneMulAddFusion
+ : Fusion<"mul-add-fusion", "HasMulAddFusion",
+ "Enable MUL+ADD macrofusion",
+ [
+ SecondFusionPredicateWithMCInstPredicate<
+ CheckOpcode<[ADD, ADDW]>
+ >,
+ WildcardTrue,
+ FirstFusionPredicateWithMCInstPredicate<
+ CheckOpcode<[MUL, MULW]>
+ >,
+ // Check that both instructions have the same width
+ FusionPredicateWithCode<[{
+ if ((FirstMI->getDesc().TSFlags & RISCVII::IsSignExtendingOpWMask) ^
----------------
topperc wrote:
Use `!=` insead of `^`
https://github.com/llvm/llvm-project/pull/178594
More information about the llvm-commits
mailing list