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:
Owen Anderson 2015-11-20 08:16:13 +00:00
parent 7d0cc23786
commit 630077ef55
3 changed files with 27 additions and 1 deletions

View File

@ -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();
}

View File

@ -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

View File

@ -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>)