Fix DSE to not eliminate volatile loads with no uses.
authorDan Gohman <gohman@apple.com>
Mon, 28 Apr 2008 19:51:27 +0000 (19:51 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 28 Apr 2008 19:51:27 +0000 (19:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50370 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/DeadStoreElimination.cpp
test/Transforms/DeadStoreElimination/volatile-load.ll [new file with mode: 0644]

index f9d1205ada558e2a6feef90bcdf9ce703a409069..89afa911e758c39f036ef963b41c7a803193e542 100644 (file)
@@ -326,9 +326,9 @@ bool DSE::handleEndBlock(BasicBlock& BB,
     
     // If we encounter a use of the pointer, it is no longer considered dead
     if (LoadInst* L = dyn_cast<LoadInst>(BBI)) {
-      // However, if this load is unused, we can go ahead and remove it, and
-      // not have to worry about it making our pointer undead!
-      if (L->use_empty()) {
+      // However, if this load is unused and not volatile, we can go ahead and remove it,
+      // and not have to worry about it making our pointer undead!
+      if (L->use_empty() && !L->isVolatile()) {
         MD.removeInstruction(L);
         
         // DCE instructions only used to calculate that load
diff --git a/test/Transforms/DeadStoreElimination/volatile-load.ll b/test/Transforms/DeadStoreElimination/volatile-load.ll
new file mode 100644 (file)
index 0000000..c458284
--- /dev/null
@@ -0,0 +1,8 @@
+; RUN: llvm-as < %s | opt -dse | llvm-dis | grep {volatile load}
+
+@g_1 = global i32 0
+
+define void @foo() nounwind  {
+       %t = volatile load i32* @g_1
+       ret void
+}