]> granicus.if.org Git - llvm/commitdiff
[NewGVN] Check that call has an access.
authorAlina Sbirlea <asbirlea@google.com>
Tue, 15 Oct 2019 17:25:36 +0000 (17:25 +0000)
committerAlina Sbirlea <asbirlea@google.com>
Tue, 15 Oct 2019 17:25:36 +0000 (17:25 +0000)
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
test/Transforms/NewGVN/pr43441.ll [new file with mode: 0644]

index f62a5e553f154ca6bb181db3f86706cb4583fc01..b213264de557eec4e5c1ef1cd97802740cc3d26b 100644 (file)
@@ -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 (file)
index 0000000..5b4fc39
--- /dev/null
@@ -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 }
+