[llvm] ba1255d - [DAG] Use FoldConstantArithmetic to constant fold (and (ext (and V, c1)), c2) -> (and (ext V), (and c1, (ext c2)))
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 20 05:10:09 PDT 2024
Author: Simon Pilgrim
Date: 2024-10-20T13:05:23+01:00
New Revision: ba1255def64a9c3c68d97ace051eec76f546eeb0
URL: https://github.com/llvm/llvm-project/commit/ba1255def64a9c3c68d97ace051eec76f546eeb0
DIFF: https://github.com/llvm/llvm-project/commit/ba1255def64a9c3c68d97ace051eec76f546eeb0.diff
LOG: [DAG] Use FoldConstantArithmetic to constant fold (and (ext (and V, c1)), c2) -> (and (ext V), (and c1, (ext c2)))
Noticed while triaging the regression from #112710 noticed by @mstorsjo - don't rely on isConstantIntBuildVectorOrConstantInt+getNode to guarantee constant folding (if it fails to constant fold it will infinite loop), use FoldConstantArithmetic instead.
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index f89734fb43e983..2527bb269643bb 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -7159,15 +7159,16 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
SDValue N0Op0 = N0.getOperand(0);
if (N0Op0.getOpcode() == ISD::AND &&
(ExtOpc != ISD::ZERO_EXTEND || !TLI.isZExtFree(N0Op0, VT)) &&
- DAG.isConstantIntBuildVectorOrConstantInt(N1) &&
- DAG.isConstantIntBuildVectorOrConstantInt(N0Op0.getOperand(1)) &&
N0->hasOneUse() && N0Op0->hasOneUse()) {
- SDValue NewMask =
- DAG.getNode(ISD::AND, DL, VT, N1,
- DAG.getNode(ExtOpc, DL, VT, N0Op0.getOperand(1)));
- return DAG.getNode(ISD::AND, DL, VT,
- DAG.getNode(ExtOpc, DL, VT, N0Op0.getOperand(0)),
- NewMask);
+ if (SDValue NewExt = DAG.FoldConstantArithmetic(ExtOpc, DL, VT,
+ {N0Op0.getOperand(1)})) {
+ if (SDValue NewMask =
+ DAG.FoldConstantArithmetic(ISD::AND, DL, VT, {N1, NewExt})) {
+ return DAG.getNode(ISD::AND, DL, VT,
+ DAG.getNode(ExtOpc, DL, VT, N0Op0.getOperand(0)),
+ NewMask);
+ }
+ }
}
}
More information about the llvm-commits
mailing list