From b09882b09654073b8ab2de081e0d72c53938fdd5 Mon Sep 17 00:00:00 2001 From: Alina Sbirlea Date: Tue, 15 Oct 2019 17:25:36 +0000 Subject: [PATCH] [NewGVN] Check that call has an access. Check that a call has an attached MemoryAccess before calling getClobbering on the instruction. If no access is attached, the instruction does not access memory. Resolves PR43441. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374920 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/NewGVN.cpp | 7 ++++-- test/Transforms/NewGVN/pr43441.ll | 42 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/NewGVN/pr43441.ll diff --git a/lib/Transforms/Scalar/NewGVN.cpp b/lib/Transforms/Scalar/NewGVN.cpp index f62a5e553f1..b213264de55 100644 --- a/lib/Transforms/Scalar/NewGVN.cpp +++ b/lib/Transforms/Scalar/NewGVN.cpp @@ -1639,8 +1639,11 @@ const Expression *NewGVN::performSymbolicCallEvaluation(Instruction *I) const { if (AA->doesNotAccessMemory(CI)) { return createCallExpression(CI, TOPClass->getMemoryLeader()); } else if (AA->onlyReadsMemory(CI)) { - MemoryAccess *DefiningAccess = MSSAWalker->getClobberingMemoryAccess(CI); - return createCallExpression(CI, DefiningAccess); + if (auto *MA = MSSA->getMemoryAccess(CI)) { + auto *DefiningAccess = MSSAWalker->getClobberingMemoryAccess(MA); + return createCallExpression(CI, DefiningAccess); + } else // MSSA determined that CI does not access memory. + return createCallExpression(CI, TOPClass->getMemoryLeader()); } return nullptr; } diff --git a/test/Transforms/NewGVN/pr43441.ll b/test/Transforms/NewGVN/pr43441.ll new file mode 100644 index 00000000000..5b4fc3937f3 --- /dev/null +++ b/test/Transforms/NewGVN/pr43441.ll @@ -0,0 +1,42 @@ +; RUN: opt -newgvn -S < %s | FileCheck %s + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK-LABEL: @print_long_format() +define dso_local void @print_long_format() #0 { +entry: + switch i32 undef, label %sw.default [ + i32 1, label %sw.bb + i32 0, label %sw.bb19 + i32 2, label %sw.bb23 + ] + +sw.bb: ; preds = %entry + unreachable + +sw.bb19: ; preds = %entry + br i1 undef, label %if.then37, label %if.end50 + +sw.bb23: ; preds = %entry + unreachable + +sw.default: ; preds = %entry + unreachable + +if.then37: ; preds = %sw.bb19 + unreachable + +if.end50: ; preds = %sw.bb19 + %call180 = call i32 @timespec_cmp() #2 + %cmp181 = icmp slt i32 %call180, 0 + ret void +} + +; Function Attrs: writeonly +declare dso_local i32 @timespec_cmp() #1 + +attributes #0 = { "use-soft-float"="false" } +attributes #1 = { writeonly } +attributes #2 = { nounwind readonly } + -- 2.40.0