diff options
| author | David Spickett <david.spickett@linaro.org> | 2024-04-29 09:36:42 +0100 |
|---|---|---|
| committer | David Spickett <david.spickett@linaro.org> | 2024-04-29 09:47:41 +0100 |
| commit | 16bd10a38730fed27a3bf111076b8ef7a7e7b3ee (patch) | |
| tree | 2ee1ba7d05d3b2faec07133301bb678f4bbdcae4 /llvm/lib/CodeGen | |
| parent | f029da5cfce66e2d460d5f54b17582810a9111ad (diff) | |
| download | llvm-16bd10a38730fed27a3bf111076b8ef7a7e7b3ee.tar.gz llvm-16bd10a38730fed27a3bf111076b8ef7a7e7b3ee.tar.bz2 llvm-16bd10a38730fed27a3bf111076b8ef7a7e7b3ee.zip | |
Revert "[SelectionDAG] Handle more opcodes in canCreateUndefOrPoison (#84921)" and more...
This reverts:
b3c55b707110084a9f50a16aade34c3be6fa18da - "[SelectionDAG] Handle more opcodes in canCreateUndefOrPoison (#84921)"
(because it updates a test case that I don't know how to resolve the conflict for)
8e2f6495c0bac1dd6ee32b6a0d24152c9c343624 - "[DAGCombiner] Do not always fold FREEZE over BUILD_VECTOR (#85932)"
73472c5996716cda0dbb3ddb788304e0e7e6a323 - "[SelectionDAG] Treat CopyFromReg as freezing the value (#85932)"
Due to a test suite failure on AArch64 when compiling for SVE.
https://lab.llvm.org/buildbot/#/builders/197/builds/13955
clang: ../llvm/llvm/include/llvm/CodeGen/ValueTypes.h:307: MVT llvm::EVT::getSimpleVT() const: Assertion `isSimple() && "Expected a SimpleValueType!"' failed.
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 26 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 17 |
2 files changed, 1 insertions, 42 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 326a004d06f2..f8949b926922 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -15459,12 +15459,6 @@ SDValue DAGCombiner::visitFREEZE(SDNode *N) { if (DAG.isGuaranteedNotToBeUndefOrPoison(N0, /*PoisonOnly*/ false)) return N0; - // We currently avoid folding freeze over SRA/SRL, due to the problems seen - // with (freeze (assert ext)) blocking simplifications of SRA/SRL. See for - // example https://reviews.llvm.org/D136529#4120959. - if (N0.getOpcode() == ISD::SRA || N0.getOpcode() == ISD::SRL) - return SDValue(); - // Fold freeze(op(x, ...)) -> op(freeze(x), ...). // Try to push freeze through instructions that propagate but don't produce // poison as far as possible. If an operand of freeze follows three @@ -15481,26 +15475,6 @@ SDValue DAGCombiner::visitFREEZE(SDNode *N) { N0.getOpcode() == ISD::BUILD_PAIR || N0.getOpcode() == ISD::CONCAT_VECTORS; - // Avoid turning a BUILD_VECTOR that can be recognized as "all zeros", "all - // ones" or "constant" into something that depends on FrozenUndef. We can - // instead pick undef values to keep those properties, while at the same time - // folding away the freeze. - // If we implement a more general solution for folding away freeze(undef) in - // the future, then this special handling can be removed. - if (N0.getOpcode() == ISD::BUILD_VECTOR) { - SDLoc DL(N0); - MVT VT = N0.getSimpleValueType(); - if (llvm::ISD::isBuildVectorAllOnes(N0.getNode())) - return DAG.getAllOnesConstant(DL, VT); - if (llvm::ISD::isBuildVectorOfConstantSDNodes(N0.getNode())) { - SmallVector<SDValue, 8> NewVecC; - for (const SDValue &Op : N0->op_values()) - NewVecC.push_back( - Op.isUndef() ? DAG.getConstant(0, DL, Op.getValueType()) : Op); - return DAG.getBuildVector(VT, DL, NewVecC); - } - } - SmallSetVector<SDValue, 8> MaybePoisonOperands; for (SDValue Op : N0->ops()) { if (DAG.isGuaranteedNotToBeUndefOrPoison(Op, /*PoisonOnly*/ false, diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index dfbfaa8c894f..224c0c5ee970 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5063,7 +5063,6 @@ bool SelectionDAG::isGuaranteedNotToBeUndefOrPoison(SDValue Op, case ISD::VALUETYPE: case ISD::FrameIndex: case ISD::TargetFrameIndex: - case ISD::CopyFromReg: return true; case ISD::UNDEF: @@ -5137,16 +5136,6 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, case ISD::FREEZE: case ISD::CONCAT_VECTORS: case ISD::INSERT_SUBVECTOR: - case ISD::SADDSAT: - case ISD::UADDSAT: - case ISD::SSUBSAT: - case ISD::USUBSAT: - case ISD::MULHU: - case ISD::MULHS: - case ISD::SMIN: - case ISD::SMAX: - case ISD::UMIN: - case ISD::UMAX: case ISD::AND: case ISD::XOR: case ISD::ROTL: @@ -5167,7 +5156,6 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, case ISD::BUILD_PAIR: return false; - case ISD::SELECT_CC: case ISD::SETCC: { // Integer setcc cannot create undef or poison. if (Op.getOperand(0).getValueType().isInteger()) @@ -5177,8 +5165,7 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, // based on options and flags. The options and flags also cause special // nonan condition codes to be used. Those condition codes may be preserved // even if the nonan flag is dropped somewhere. - unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4; - ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get(); + ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(2))->get(); if (((unsigned)CCCode & 0x10U)) return true; @@ -5195,8 +5182,6 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, return false; case ISD::SHL: - case ISD::SRL: - case ISD::SRA: // If the max shift amount isn't in range, then the shift can create poison. return !getValidMaximumShiftAmountConstant(Op, DemandedElts); |
