The function that does nothing but call malloc is noalias return.
authorNick Lewycky <nicholas@mxc.ca>
Sun, 25 Jan 2009 07:59:57 +0000 (07:59 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sun, 25 Jan 2009 07:59:57 +0000 (07:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62956 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/IndMemRemoval.cpp
test/Transforms/IndMemRem/2009-01-24-Noalias.ll [new file with mode: 0644]

index b251ab4b09c11331673503039d58a8b44c69d1fd..6b1f969e440e46fadf8722aa8c7e0b4386ee303a 100644 (file)
@@ -44,11 +44,11 @@ static RegisterPass<IndMemRemPass>
 X("indmemrem","Indirect Malloc and Free Removal");
 
 bool IndMemRemPass::runOnModule(Module &M) {
-  //in Theory, all direct calls of malloc and free should be promoted
-  //to intrinsics.  Therefor, this goes through and finds where the
-  //address of free or malloc are taken and replaces those with bounce
-  //functions, ensuring that all malloc and free that might happen
-  //happen through intrinsics.
+  // In theory, all direct calls of malloc and free should be promoted
+  // to intrinsics.  Therefore, this goes through and finds where the
+  // address of free or malloc are taken and replaces those with bounce
+  // functions, ensuring that all malloc and free that might happen
+  // happen through intrinsics.
   bool changed = false;
   if (Function* F = M.getFunction("free")) {
     if (F->isDeclaration() && F->arg_size() == 1 && !F->use_empty()) {
@@ -69,6 +69,7 @@ bool IndMemRemPass::runOnModule(Module &M) {
       Function* FN = Function::Create(F->getFunctionType(), 
                                       GlobalValue::LinkOnceLinkage, 
                                       "malloc_llvm_bounce", &M);
+      FN->setDoesNotAlias(0);
       BasicBlock* bb = BasicBlock::Create("entry",FN);
       Instruction* c = CastInst::CreateIntegerCast(
           FN->arg_begin(), Type::Int32Ty, false, "c", bb);
diff --git a/test/Transforms/IndMemRem/2009-01-24-Noalias.ll b/test/Transforms/IndMemRem/2009-01-24-Noalias.ll
new file mode 100644 (file)
index 0000000..bc3d0bf
--- /dev/null
@@ -0,0 +1,11 @@
+; RUN: llvm-as < %s | opt -indmemrem | llvm-dis | grep bounce | grep noalias
+
+declare i8* @malloc(i32)
+
+@g = external global i8*
+
+define void @test() {
+  %A = bitcast i8* (i32) * @malloc to i8*
+  store i8* %A, i8** @g
+  ret void
+}