Created
December 18, 2024 11:57
-
-
Save widlarizer/fed8fe3c836037730bdb2b65ceca9a9b to your computer and use it in GitHub Desktop.
GlobalISel generic combiner example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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