Skip to content

Instantly share code, notes, and snippets.

@widlarizer
Created December 18, 2024 11:57
Show Gist options
  • Save widlarizer/fed8fe3c836037730bdb2b65ceca9a9b to your computer and use it in GitHub Desktop.
Save widlarizer/fed8fe3c836037730bdb2b65ceca9a9b to your computer and use it in GitHub Desktop.
GlobalISel generic combiner example
// llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
bool CombinerHelper::matchBinOpSameVal(MachineInstr &MI) {
return matchEqualDefs(MI.getOperand(1), MI.getOperand(2)) &&
canReplaceReg(MI.getOperand(0).getReg(), MI.getOperand(1).getReg(),
MRI);
}
bool CombinerHelper::replaceSingleDefInstWithOperand(MachineInstr &MI,
unsigned OpIdx) {
assert(MI.getNumExplicitDefs() == 1 && "Expected one explicit def?");
Register OldReg = MI.getOperand(0).getReg();
Register Replacement = MI.getOperand(OpIdx).getReg();
assert(canReplaceReg(OldReg, Replacement, MRI) && "Cannot replace register?");
MI.eraseFromParent();
replaceRegWith(MRI, OldReg, Replacement);
return true;
}
// llvm/include/llvm/Target/GlobalISel/Combine.td
// Fold (x op x) - > x
def binop_same_val: GICombineRule<
(defs root:$root),
(match (wip_match_opcode G_AND, G_OR):$root,
[{ return Helper.matchBinOpSameVal(*${root}); }]),
(apply [{ return Helper.replaceSingleDefInstWithOperand(*${root}, 1); }])
>;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment