[PATCH] D17087: [RegAlloc] CalcSpillWeights: Fix infinite loop

Quentin Colombet via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 10 15:34:11 PST 2016


Thanks for the update.

If you need help narrowing that down, please file a PR with the symptoms and how to reproduce.

Cheers,
Q.
> On Feb 10, 2016, at 3:17 PM, Tim Shen <timshen at google.com> wrote:
> 
> timshen updated this revision to Diff 47550.
> timshen added a comment.
> 
> Attached reduced test case.
> 
> Sorry, I also found that this change is wrong. I thought it works but I forgot to turn on assertion. This test case triggers an assertion failure with this change. I will do more investigation.
> 
> 
> http://reviews.llvm.org/D17087 <http://reviews.llvm.org/D17087>
> 
> Files:
>  lib/CodeGen/CalcSpillWeights.cpp
>  test/CodeGen/PowerPC/calc-spill-weight-circle.ll
> 
> Index: test/CodeGen/PowerPC/calc-spill-weight-circle.ll
> ===================================================================
> --- /dev/null
> +++ test/CodeGen/PowerPC/calc-spill-weight-circle.ll
> @@ -0,0 +1,48 @@
> +; RUN: llc < %s | FileCheck %s
> +; CHECK-LABEL: TestFoo
> +target triple = "powerpc64le-unknown-linux-gnu"
> +
> +declare double @sqrt(double)
> +
> +declare double @cos(double)
> +
> +declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>)
> +
> +define void @TestFoo() {
> +bb3:
> +  %tmp = load <2 x double>, <2 x double>* undef
> +  %tmp4 = fsub <2 x double> zeroinitializer, undef
> +  %tmp5 = fsub <2 x double> zeroinitializer, undef
> +  %tmp6 = call <2 x double> @llvm.fma.v2f64(<2 x double> undef, <2 x double> undef, <2 x double> %tmp)
> +  %tmp7 = fsub <2 x double> %tmp4, %tmp6
> +  %tmp8 = call <2 x double> @llvm.fma.v2f64(<2 x double> %tmp7, <2 x double> undef, <2 x double> %tmp)
> +  %tmp9 = call <2 x double> @llvm.fma.v2f64(<2 x double> undef, <2 x double> undef, <2 x double> %tmp)
> +  %tmp10 = fsub <2 x double> %tmp5, %tmp9
> +  %tmp11 = call <2 x double> @llvm.fma.v2f64(<2 x double> %tmp10, <2 x double> undef, <2 x double> %tmp)
> +  %tmp12 = load <2 x double>, <2 x double>* undef
> +  %tmp13 = call <2 x double> @llvm.fma.v2f64(<2 x double> undef, <2 x double> zeroinitializer, <2 x double> %tmp12)
> +  br i1 undef, label %bb23, label %bb24
> +
> +bb15:
> +  %tmp16 = call double @cos(double undef)
> +  %tmp17 = call <2 x double> @llvm.fma.v2f64(<2 x double> %tmp11, <2 x double> undef, <2 x double> undef)
> +  %tmp18 = fadd <2 x double> %tmp17, undef
> +  %tmp19 = fsub <2 x double> %tmp18, undef
> +  %tmp20 = call <2 x double> @llvm.fma.v2f64(<2 x double> %tmp19, <2 x double> undef, <2 x double> undef)
> +  store <2 x double> %tmp20, <2 x double>* undef
> +  %tmp21 = fsub <2 x double> %tmp13, undef
> +  %tmp22 = call <2 x double> @llvm.fma.v2f64(<2 x double> %tmp21, <2 x double> undef, <2 x double> undef)
> +  store <2 x double> %tmp22, <2 x double>* undef
> +  ret void
> +
> +bb23:
> +  %exitcond.i.i.i16.i = icmp eq i32 undef, 10
> +  br i1 %exitcond.i.i.i16.i, label %bb15, label %bb23
> +
> +bb24:
> +  %tmp25 = call double @sqrt(double undef)
> +  %tmp26 = fsub <2 x double> %tmp8, undef
> +  %tmp27 = call <2 x double> @llvm.fma.v2f64(<2 x double> %tmp26, <2 x double> undef, <2 x double> undef)
> +  store <2 x double> %tmp27, <2 x double>* undef
> +  ret void
> +}
> Index: lib/CodeGen/CalcSpillWeights.cpp
> ===================================================================
> --- lib/CodeGen/CalcSpillWeights.cpp
> +++ lib/CodeGen/CalcSpillWeights.cpp
> @@ -74,12 +74,12 @@
> }
> 
> // Check if all values in LI are rematerializable
> -static bool isRematerializable(const LiveInterval &LI,
> -                               const LiveIntervals &LIS,
> -                               VirtRegMap *VRM,
> +static bool isRematerializable(const LiveInterval &LI, const LiveIntervals &LIS,
> +                               const VirtRegMap *VRM,
>                                const TargetInstrInfo &TII) {
>   unsigned Reg = LI.reg;
>   unsigned Original = VRM ? VRM->getOriginal(Reg) : 0;
> +  SmallPtrSet<const VNInfo *, 4> Visited;
>   for (LiveInterval::const_vni_iterator I = LI.vni_begin(), E = LI.vni_end();
>        I != E; ++I) {
>     const VNInfo *VNI = *I;
> @@ -113,6 +113,8 @@
>         const LiveInterval &SrcLI = LIS.getInterval(Reg);
>         LiveQueryResult SrcQ = SrcLI.Query(VNI->def);
>         VNI = SrcQ.valueIn();
> +        if (!Visited.insert(VNI).second)
> +          break;
>         assert(VNI && "Copy from non-existing value");
>         if (VNI->isPHIDef())
>           return false;
> 
> 
> <D17087.47550.patch>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160210/9b921994/attachment-0001.html>


More information about the llvm-commits mailing list