summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/Scalar/NewGVN.cpp7
-rw-r--r--llvm/test/Transforms/NewGVN/pr43441.ll42
2 files changed, 47 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/NewGVN.cpp b/llvm/lib/Transforms/Scalar/NewGVN.cpp
index f62a5e553f1..b213264de55 100644
--- a/llvm/lib/Transforms/Scalar/NewGVN.cpp
+++ b/llvm/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/llvm/test/Transforms/NewGVN/pr43441.ll b/llvm/test/Transforms/NewGVN/pr43441.ll
new file mode 100644
index 00000000000..5b4fc3937f3
--- /dev/null
+++ b/llvm/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 }
+
OpenPOWER on IntegriCloud