From c31e75d1995c44d4bd80c5e41c73a6c29528adc7 Mon Sep 17 00:00:00 2001 From: Tim Shen Date: Fri, 13 Jul 2018 23:40:00 +0000 Subject: [PATCH] [LSR] If no Use is interesting, early return. 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 | 4 +- test/CodeGen/X86/lsr-crash-empty-uses.ll | 41 ++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/X86/lsr-crash-empty-uses.ll diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 03429e9698a..fa83b48210b 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -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 index 00000000000..ef72f87cce4 --- /dev/null +++ b/test/CodeGen/X86/lsr-crash-empty-uses.ll @@ -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 +} -- 2.50.1