mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-02 02:46:07 +00:00
[DAGCombiner] Don't speculatively create an all ones constant in visitREM that might not be used.
This looks to have been done to save some duplicated code under two different if statements, but it ends up being harmful to D94073. This speculative constant can be called on a scalable vector type with i64 element size when i64 scalars aren't legal. The code tries and fails to find a vector type with i32 elements that it can use. So only create the node when we know it will be used.
This commit is contained in:
parent
5a1d31a284
commit
4ef91f5871
@ -4274,9 +4274,9 @@ SDValue DAGCombiner::visitREM(SDNode *N) {
|
||||
if (DAG.SignBitIsZero(N1) && DAG.SignBitIsZero(N0))
|
||||
return DAG.getNode(ISD::UREM, DL, VT, N0, N1);
|
||||
} else {
|
||||
SDValue NegOne = DAG.getAllOnesConstant(DL, VT);
|
||||
if (DAG.isKnownToBeAPowerOfTwo(N1)) {
|
||||
// fold (urem x, pow2) -> (and x, pow2-1)
|
||||
SDValue NegOne = DAG.getAllOnesConstant(DL, VT);
|
||||
SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N1, NegOne);
|
||||
AddToWorklist(Add.getNode());
|
||||
return DAG.getNode(ISD::AND, DL, VT, N0, Add);
|
||||
@ -4284,6 +4284,7 @@ SDValue DAGCombiner::visitREM(SDNode *N) {
|
||||
if (N1.getOpcode() == ISD::SHL &&
|
||||
DAG.isKnownToBeAPowerOfTwo(N1.getOperand(0))) {
|
||||
// fold (urem x, (shl pow2, y)) -> (and x, (add (shl pow2, y), -1))
|
||||
SDValue NegOne = DAG.getAllOnesConstant(DL, VT);
|
||||
SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N1, NegOne);
|
||||
AddToWorklist(Add.getNode());
|
||||
return DAG.getNode(ISD::AND, DL, VT, N0, Add);
|
||||
|
Loading…
x
Reference in New Issue
Block a user