]> granicus.if.org Git - llvm/commitdiff
[LSR] If no Use is interesting, early return.
authorTim Shen <timshen91@gmail.com>
Fri, 13 Jul 2018 23:40:00 +0000 (23:40 +0000)
committerTim Shen <timshen91@gmail.com>
Fri, 13 Jul 2018 23:40:00 +0000 (23:40 +0000)
Summary:
By looking at the callers of getUse(), we can see that even though
IVUsers may offer uses, but they may not be interesting to
LSR. It's possible that none of them is interesting.

Reviewers: sanjoy

Subscribers: jlebar, hiraditya, bixia, llvm-commits

Differential Revision: https://reviews.llvm.org/D49049

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337072 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopStrengthReduce.cpp
test/CodeGen/X86/lsr-crash-empty-uses.ll [new file with mode: 0644]

index 03429e9698a43be351b52d104f5f0c5d2fa1d891..fa83b48210bc9d946f0a1cd377b71904437e4e06 100644 (file)
@@ -5400,7 +5400,9 @@ LSRInstance::LSRInstance(Loop *L, IVUsers &IU, ScalarEvolution &SE,
   CollectFixupsAndInitialFormulae();
   CollectLoopInvariantFixupsAndFormulae();
 
-  assert(!Uses.empty() && "IVUsers reported at least one use");
+  if (Uses.empty())
+    return;
+
   LLVM_DEBUG(dbgs() << "LSR found " << Uses.size() << " uses:\n";
              print_uses(dbgs()));
 
diff --git a/test/CodeGen/X86/lsr-crash-empty-uses.ll b/test/CodeGen/X86/lsr-crash-empty-uses.ll
new file mode 100644 (file)
index 0000000..ef72f87
--- /dev/null
@@ -0,0 +1,41 @@
+; RUN: llc --start-before loop-reduce --stop-after loop-reduce %s -o - | FileCheck %s
+target datalayout = "e-m:e-p:32:32-i64:64-n32-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @hoge() {
+bb:
+  %tmp = sext i32 undef to i64
+  %tmp3 = sub nsw i64 0, %tmp
+  br label %bb4
+
+bb4:                                              ; preds = %bb20, %bb
+  %tmp5 = getelementptr inbounds double, double* undef, i64 undef
+  %tmp6 = getelementptr inbounds double, double* %tmp5, i64 %tmp3
+  br label %bb7
+
+bb7:                                              ; preds = %bb7, %bb4
+  %tmp8 = phi double* [ %tmp10, %bb7 ], [ %tmp6, %bb4 ]
+  %tmp9 = load double, double* %tmp8
+  %tmp10 = getelementptr inbounds double, double* %tmp8, i64 1
+  br i1 true, label %bb11, label %bb7
+
+bb11:                                             ; preds = %bb7
+  br i1 undef, label %bb20, label %bb12
+
+bb12:                                             ; preds = %bb11
+  br label %bb13
+
+bb13:                                             ; preds = %bb13, %bb12
+  %tmp14 = phi double* [ %tmp18, %bb13 ], [ %tmp10, %bb12 ]
+  %tmp15 = load double, double* %tmp14, align 8
+  %tmp16 = getelementptr inbounds double, double* %tmp14, i64 1
+  %tmp17 = load double, double* %tmp16, align 8
+  %tmp18 = getelementptr inbounds double, double* %tmp14, i64 8
+  br i1 true, label %bb19, label %bb13
+
+bb19:                                             ; preds = %bb13
+  br label %bb20
+
+bb20:                                             ; preds = %bb19, %bb11
+  br label %bb4
+}