[llvm] DAG: Fix asserting in error case for powi softening (PR #147237)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 6 22:26:10 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-selectiondag
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
We need to return the expected legalized type, not the original
in this case. Also swap to returning poison, and avoid contraction
in error message.
---
Full diff: https://github.com/llvm/llvm-project/pull/147237.diff
1 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp (+5-4)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
index 7dfb43164be37..64d9c1586796f 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
@@ -724,11 +724,13 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_ExpOp(SDNode *N) {
RTLIB::Libcall LC = IsPowI ? RTLIB::getPOWI(N->getValueType(0))
: RTLIB::getLDEXP(N->getValueType(0));
assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fpowi.");
+ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
+
if (!TLI.getLibcallName(LC)) {
// Some targets don't have a powi libcall; use pow instead.
// FIXME: Implement this if some target needs it.
- DAG.getContext()->emitError("Don't know how to soften fpowi to fpow");
- return DAG.getUNDEF(N->getValueType(0));
+ DAG.getContext()->emitError("do not know how to soften fpowi to fpow");
+ return DAG.getPOISON(NVT);
}
if (DAG.getLibInfo().getIntSize() !=
@@ -736,10 +738,9 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_ExpOp(SDNode *N) {
// If the exponent does not match with sizeof(int) a libcall to RTLIB::POWI
// would use the wrong type for the argument.
DAG.getContext()->emitError("POWI exponent does not match sizeof(int)");
- return DAG.getUNDEF(N->getValueType(0));
+ return DAG.getPOISON(NVT);
}
- EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0 + Offset)),
N->getOperand(1 + Offset) };
SDValue Chain = IsStrict ? N->getOperand(0) : SDValue();
``````````
</details>
https://github.com/llvm/llvm-project/pull/147237
More information about the llvm-commits
mailing list