[llvm] r253655 - Fix a pair of issues that caused an infinite loop in reassociate.
Yaron Keren via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 2 22:01:58 PST 2015
This fixed http://llvm.org/pr25577, thanks!
2015-11-20 10:16 GMT+02:00 Owen Anderson via llvm-commits <
llvm-commits at lists.llvm.org>:
> Author: resistor
> Date: Fri Nov 20 02:16:13 2015
> New Revision: 253655
>
> URL: http://llvm.org/viewvc/llvm-project?rev=253655&view=rev
> Log:
> 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.
>
> Added:
> llvm/trunk/test/Transforms/Reassociate/fp-expr.ll
> Modified:
> llvm/trunk/lib/IR/Constants.cpp
> llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
>
> Modified: llvm/trunk/lib/IR/Constants.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Constants.cpp?rev=253655&r1=253654&r2=253655&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/Constants.cpp (original)
> +++ llvm/trunk/lib/IR/Constants.cpp Fri Nov 20 02:16:13 2015
> @@ -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();
> }
>
> Modified: llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp?rev=253655&r1=253654&r2=253655&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp Fri Nov 20 02:16:13
> 2015
> @@ -2064,7 +2064,7 @@ void Reassociate::OptimizeInst(Instructi
> 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
>
> Added: llvm/trunk/test/Transforms/Reassociate/fp-expr.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/fp-expr.ll?rev=253655&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/Reassociate/fp-expr.ll (added)
> +++ llvm/trunk/test/Transforms/Reassociate/fp-expr.ll Fri Nov 20 02:16:13
> 2015
> @@ -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>)
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151203/e4443768/attachment.html>
More information about the llvm-commits
mailing list