forked from OSchip/llvm-project
Fix a pair of issues that caused an infinite loop in reassociate.
Terrifyingly, one of them is a mishandling of floating point vectors in Constant::isZero(). How exactly this issue survived this long is beyond me. llvm-svn: 253655
This commit is contained in:
parent
7d0cc23786
commit
630077ef55
|
@ -68,6 +68,12 @@ bool Constant::isZeroValue() const {
|
|||
if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
|
||||
return CFP->isZero();
|
||||
|
||||
// Equivalent for a vector of -0.0's.
|
||||
if (const ConstantDataVector *CV = dyn_cast<ConstantDataVector>(this))
|
||||
if (ConstantFP *SplatCFP = dyn_cast_or_null<ConstantFP>(CV->getSplatValue()))
|
||||
if (SplatCFP && SplatCFP->isZero())
|
||||
return true;
|
||||
|
||||
// Otherwise, just use +0.0.
|
||||
return isNullValue();
|
||||
}
|
||||
|
|
|
@ -2064,7 +2064,7 @@ void Reassociate::OptimizeInst(Instruction *I) {
|
|||
return;
|
||||
|
||||
// Don't optimize floating point instructions that don't have unsafe algebra.
|
||||
if (I->getType()->isFloatingPointTy() && !I->hasUnsafeAlgebra())
|
||||
if (I->getType()->isFPOrFPVectorTy() && !I->hasUnsafeAlgebra())
|
||||
return;
|
||||
|
||||
// Do not reassociate boolean (i1) expressions. We want to preserve the
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
; RUN: opt -S -reassociate < %s | FileCheck %s
|
||||
|
||||
define void @test1() {
|
||||
; CHECK-LABEL: @test1
|
||||
; CHECK: call
|
||||
; CHECK: fsub
|
||||
; CHECK: fadd
|
||||
%tmp = tail call <4 x float> @blam()
|
||||
%tmp23 = fsub fast <4 x float> undef, %tmp
|
||||
%tmp24 = fadd fast <4 x float> %tmp23, undef
|
||||
tail call void @wombat(<4 x float> %tmp24)
|
||||
ret void
|
||||
}
|
||||
|
||||
; Function Attrs: optsize
|
||||
declare <4 x float> @blam()
|
||||
|
||||
; Function Attrs: optsize
|
||||
declare void @wombat(<4 x float>)
|
||||
|
Loading…
Reference in New Issue