aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/IPO/FunctionAttrs.cpp5
-rw-r--r--test/Transforms/FunctionAttrs/2009-05-06-Malloc.ll7
2 files changed, 12 insertions, 0 deletions
diff --git a/lib/Transforms/IPO/FunctionAttrs.cpp b/lib/Transforms/IPO/FunctionAttrs.cpp
index 65faef32e5..e8315247b2 100644
--- a/lib/Transforms/IPO/FunctionAttrs.cpp
+++ b/lib/Transforms/IPO/FunctionAttrs.cpp
@@ -152,6 +152,11 @@ bool FunctionAttrs::AddReadAttrs(const std::vector<CallGraphNode *> &SCC) {
if (I->mayWriteToMemory())
// Writes memory. Just give up.
return false;
+
+ if (isa<MallocInst>(I))
+ // MallocInst claims not to write memory! PR3754.
+ return false;
+
// If this instruction may read memory, remember that.
ReadsMemory |= I->mayReadFromMemory();
}
diff --git a/test/Transforms/FunctionAttrs/2009-05-06-Malloc.ll b/test/Transforms/FunctionAttrs/2009-05-06-Malloc.ll
new file mode 100644
index 0000000000..4022033c3b
--- /dev/null
+++ b/test/Transforms/FunctionAttrs/2009-05-06-Malloc.ll
@@ -0,0 +1,7 @@
+; RUN: llvm-as < %s | opt -functionattrs | llvm-dis | not grep read
+; PR3754
+
+define i8* @m(i32 %size) {
+ %tmp = malloc i8, i32 %size ; <i8*> [#uses=1]
+ ret i8* %tmp
+}