[llvm] r303361 - [LSR] Call canonicalize after we generate a new Formula in GenerateTruncates. Fix PR33077.

Wei Mi via llvm-commits llvm-commits at lists.llvm.org
Thu May 18 10:21:22 PDT 2017


Author: wmi
Date: Thu May 18 12:21:22 2017
New Revision: 303361

URL: http://llvm.org/viewvc/llvm-project?rev=303361&view=rev
Log:
[LSR] Call canonicalize after we generate a new Formula in GenerateTruncates. Fix PR33077.

The testcase in PR33077 generates a LSR Use Formula with two SCEVAddRecExprs for the same
loop. Such uncommon formula will become non-canonical after GenerateTruncates adds sign
extension to the ScaledReg of the Formula, and it will break the assertion that every
Formula to be inserted is canonical.

The fix is to call canonicalize for the raw Formula generated by GenerateTruncates
before inserting it.


Added:
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=303361&r1=303360&r2=303361&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Thu May 18 12:21:22 2017
@@ -3805,6 +3805,7 @@ void LSRInstance::GenerateTruncates(LSRU
       if (!F.hasRegsUsedByUsesOtherThan(LUIdx, RegUses))
         continue;
 
+      F.canonicalize(*L);
       (void)InsertFormula(LU, LUIdx, F);
     }
   }

Added: llvm/trunk/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll?rev=303361&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll (added)
+++ llvm/trunk/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll Thu May 18 12:21:22 2017
@@ -0,0 +1,36 @@
+; REQUIRES: asserts
+; RUN: opt -mtriple=x86_64-unknown-linux-gnu -loop-reduce -S < %s
+; PR33077. Check the LSR Use formula to be inserted is already canonicalized and
+; will not trigger assertion.
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+; Function Attrs: uwtable
+define void @foo() { 
+cHeapLvb.exit:
+  br label %not_zero48.us
+
+not_zero48.us:                                    ; preds = %not_zero48.us, %cHeapLvb.exit
+  %indvars.iv.us = phi i64 [ %indvars.iv.next.us.7, %not_zero48.us ], [ undef, %cHeapLvb.exit ]
+  %0 = phi i32 [ %13, %not_zero48.us ], [ undef, %cHeapLvb.exit ]
+  %indvars.iv.next.us = add nuw nsw i64 %indvars.iv.us, 1
+  %1 = add i32 %0, 2
+  %2 = getelementptr inbounds i32, i32 addrspace(1)* undef, i64 %indvars.iv.next.us
+  %3 = load i32, i32 addrspace(1)* %2, align 4
+  %4 = add i32 %0, 3
+  %5 = load i32, i32 addrspace(1)* undef, align 4
+  %6 = sub i32 undef, %5
+  %factor.us.2 = shl i32 %6, 1
+  %7 = add i32 %factor.us.2, %1
+  %8 = load i32, i32 addrspace(1)* undef, align 4
+  %9 = sub i32 %7, %8
+  %factor.us.3 = shl i32 %9, 1
+  %10 = add i32 %factor.us.3, %4
+  %11 = load i32, i32 addrspace(1)* undef, align 4
+  %12 = sub i32 %10, %11
+  %factor.us.4 = shl i32 %12, 1
+  %13 = add i32 %0, 8
+  %indvars.iv.next.us.7 = add nsw i64 %indvars.iv.us, 8
+  br label %not_zero48.us
+}
+




More information about the llvm-commits mailing list