mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-04 10:04:33 +00:00
[InstCombine] Fix an assertion when fmul has a ConstantExpr operand
isNormalFp and isFiniteNonZeroFp should not assume vector operands can not be constant expressions. Patch by Pawel Jurek <pawel.jurek@intel.com> Differential Revision: http://reviews.llvm.org/D8053 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231359 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bc55462859
commit
2d8a36ee71
@ -422,7 +422,7 @@ static bool isFiniteNonZeroFp(Constant *C) {
|
||||
if (C->getType()->isVectorTy()) {
|
||||
for (unsigned I = 0, E = C->getType()->getVectorNumElements(); I != E;
|
||||
++I) {
|
||||
ConstantFP *CFP = dyn_cast<ConstantFP>(C->getAggregateElement(I));
|
||||
ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(C->getAggregateElement(I));
|
||||
if (!CFP || !CFP->getValueAPF().isFiniteNonZero())
|
||||
return false;
|
||||
}
|
||||
@ -437,7 +437,7 @@ static bool isNormalFp(Constant *C) {
|
||||
if (C->getType()->isVectorTy()) {
|
||||
for (unsigned I = 0, E = C->getType()->getVectorNumElements(); I != E;
|
||||
++I) {
|
||||
ConstantFP *CFP = dyn_cast<ConstantFP>(C->getAggregateElement(I));
|
||||
ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(C->getAggregateElement(I));
|
||||
if (!CFP || !CFP->getValueAPF().isNormal())
|
||||
return false;
|
||||
}
|
||||
|
@ -267,6 +267,14 @@ define <4 x float> @fmul3_vec(<4 x float> %f1, <4 x float> %f2) {
|
||||
; CHECK: fmul fast <4 x float> %f1, <float 3.000000e+00, float 2.000000e+00, float 1.000000e+00, float 1.000000e+00>
|
||||
}
|
||||
|
||||
; Make sure fmul with constant expression doesn't assert.
|
||||
define <4 x float> @fmul3_vec_constexpr(<4 x float> %f1, <4 x float> %f2) {
|
||||
%constExprMul = bitcast i128 trunc (i160 bitcast (<5 x float> <float 6.0e+3, float 6.0e+3, float 2.0e+3, float 1.0e+3, float undef> to i160) to i128) to <4 x float>
|
||||
%t1 = fdiv <4 x float> %f1, <float 2.0e+3, float 3.0e+3, float 2.0e+3, float 1.0e+3>
|
||||
%t3 = fmul fast <4 x float> %t1, %constExprMul
|
||||
ret <4 x float> %t3
|
||||
}
|
||||
|
||||
; Rule "X/C1 * C2 => X * (C2/C1) is not applicable if C2/C1 is either a special
|
||||
; value of a denormal. The 0x3810000000000000 here take value FLT_MIN
|
||||
;
|
||||
|
Loading…
Reference in New Issue
Block a user