[llvm] r222040 - InstCombine: Fix infinite loop caused by visitFPTrunc

Manman Ren mren at apple.com
Mon Nov 17 16:17:02 PST 2014


Hi David,

I think this breaks the public stage2 builedbot: http://lab.llvm.org:8080/green/job/clang-Rlto_master/298/

r222039 builds fine, but r222040 does not, from my local debugging.

Can we revert this commit and see if the bot becomes green?

Thanks,
Manman

> On Nov 14, 2014, at 1:21 PM, David Majnemer <david.majnemer at gmail.com> wrote:
> 
> Author: majnemer
> Date: Fri Nov 14 15:21:15 2014
> New Revision: 222040
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=222040&view=rev
> Log:
> InstCombine: Fix infinite loop caused by visitFPTrunc
> 
> We would attempt to replace a fptrunc of an frem with an identical
> fptrunc.  This would cause the new fptrunc to be added to the worklist.
> Of course, this results in an infinite loop because we will keep
> visiting the newly created fptruncs.
> 
> This fixes PR21576.
> 
> Modified:
>    llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
>    llvm/trunk/test/Transforms/InstCombine/fpcast.ll
> 
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=222040&r1=222039&r2=222040&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Fri Nov 14 15:21:15 2014
> @@ -1269,14 +1269,17 @@ Instruction *InstCombiner::visitFPTrunc(
>         // type of OpI doesn't enter into things at all.  We simply evaluate
>         // in whichever source type is larger, then convert to the
>         // destination type.
> +        Value *NewLHS = LHSOrig, *NewRHS = RHSOrig;
>         if (LHSWidth < SrcWidth)
> -          LHSOrig = Builder->CreateFPExt(LHSOrig, RHSOrig->getType());
> +          NewLHS = Builder->CreateFPExt(NewLHS, RHSOrig->getType());
>         else if (RHSWidth <= SrcWidth)
> -          RHSOrig = Builder->CreateFPExt(RHSOrig, LHSOrig->getType());
> -        Value *ExactResult = Builder->CreateFRem(LHSOrig, RHSOrig);
> -        if (Instruction *RI = dyn_cast<Instruction>(ExactResult))
> -          RI->copyFastMathFlags(OpI);
> -        return CastInst::CreateFPCast(ExactResult, CI.getType());
> +          NewRHS = Builder->CreateFPExt(NewRHS, LHSOrig->getType());
> +        if (NewLHS != LHSOrig || NewRHS != RHSOrig) {
> +          Value *ExactResult = Builder->CreateFRem(NewLHS, NewRHS);
> +          if (Instruction *RI = dyn_cast<Instruction>(ExactResult))
> +            RI->copyFastMathFlags(OpI);
> +          return CastInst::CreateFPCast(ExactResult, CI.getType());
> +        }
>     }
> 
>     // (fptrunc (fneg x)) -> (fneg (fptrunc x))
> 
> Modified: llvm/trunk/test/Transforms/InstCombine/fpcast.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fpcast.ll?rev=222040&r1=222039&r2=222040&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/fpcast.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/fpcast.ll Fri Nov 14 15:21:15 2014
> @@ -53,3 +53,13 @@ define half @test5(float %a, float %b, f
> }
> 
> declare float @llvm.fabs.f32(float) nounwind readonly
> +
> +define <1 x float> @test6(<1 x double> %V) {
> +  %frem = frem <1 x double> %V, %V
> +  %trunc = fptrunc <1 x double> %frem to <1 x float>
> +  ret <1 x float> %trunc
> +; CHECK-LABEL: @test6
> +; CHECK-NEXT: %[[frem:.*]]  = frem <1 x double> %V, %V
> +; CHECK-NEXT: %[[trunc:.*]] = fptrunc <1 x double> %[[frem]] to <1 x float>
> +; CHECK-NEXT: ret <1 x float> %trunc
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list