[llvm] [GISel] Fold bitreverse(shl/srl(bitreverse(x),y)) -> srl/shl(x,y) (PR #91355)
Madhur Amilkanthwar via llvm-commits
llvm-commits at lists.llvm.org
Wed May 8 07:29:31 PDT 2024
================
@@ -2016,6 +2016,32 @@ void CombinerHelper::applyCombineShlOfExtend(MachineInstr &MI,
MI.eraseFromParent();
}
+bool CombinerHelper::matchBitreverseShift(MachineInstr &MI,
+ BuildFnTy &MatchInfo) {
+ assert(MI.getOpcode() == TargetOpcode::G_BITREVERSE && "Expected BITREVERSE");
+ Register Dst = MI.getOperand(0).getReg();
+ Register Src = MI.getOperand(1).getReg();
+ Register Val, Amt;
+
+ // fold (bitreverse (shl (bitreverse x), y)) -> (lshr x, y)
+ if (mi_match(Src, MRI, m_GShl(m_GBitreverse(m_Reg(Val)), m_Reg(Amt))) &&
+ isLegalOrBeforeLegalizer(
+ {TargetOpcode::G_LSHR, {MRI.getType(Val), MRI.getType(Amt)}})) {
+ MatchInfo = [=](MachineIRBuilder &B) { B.buildLShr(Dst, Val, Amt); };
+ return true;
+ }
+
+ // fold (bitreverse (lshr (bitreverse x), y)) -> (shl x, y)
+ if (mi_match(Src, MRI, m_GLShr(m_GBitreverse(m_Reg(Val)), m_Reg(Amt))) &&
+ isLegalOrBeforeLegalizer(
+ {TargetOpcode::G_SHL, {MRI.getType(Val), MRI.getType(Amt)}})) {
+ MatchInfo = [=](MachineIRBuilder &B) { B.buildShl(Dst, Val, Amt); };
+ return true;
+ }
----------------
madhur13490 wrote:
Yes, I agree. I think you have to match them again because you are combining the "match" step in a single function. Splitting would just call the function - matchBitreverseShiftLeft/right and then just check for other conditions.
https://github.com/llvm/llvm-project/pull/91355
More information about the llvm-commits
mailing list