[llvm] f7988d0 - Revert "[BasicAA] Remove unneeded special case for malloc/calloc"

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Wed May 18 07:35:34 PDT 2022


Author: Philip Reames
Date: 2022-05-18T07:35:27-07:00
New Revision: f7988d08a8bf11e551e720ba72c90c42d6756ece

URL: https://github.com/llvm/llvm-project/commit/f7988d08a8bf11e551e720ba72c90c42d6756ece
DIFF: https://github.com/llvm/llvm-project/commit/f7988d08a8bf11e551e720ba72c90c42d6756ece.diff

LOG: Revert "[BasicAA] Remove unneeded special case for malloc/calloc"

This reverts commit 9b1e00738c5ddba681e17e5cb7c260d9afc4c3a7.

Nikic reported in commit thread that I had forgotten history here, and that a) we'd tried this before, and b) had to revert due to an unexpected codegen impact.  Current measurements confirm the same issue still exists.

Added: 
    

Modified: 
    llvm/lib/Analysis/BasicAliasAnalysis.cpp
    llvm/test/Transforms/GVN/nonescaping-malloc.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
index 63d58425ce317..cfb34686bd429 100644
--- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
@@ -994,6 +994,20 @@ ModRefInfo BasicAAResult::getModRefInfo(const CallBase *Call,
     }
   }
 
+  // If the call is malloc/calloc like, we can assume that it doesn't
+  // modify any IR visible value.  This is only valid because we assume these
+  // routines do not read values visible in the IR.  TODO: Consider special
+  // casing realloc and strdup routines which access only their arguments as
+  // well.  Or alternatively, replace all of this with inaccessiblememonly once
+  // that's implemented fully.
+  if (isMallocOrCallocLikeFn(Call, &TLI)) {
+    // Be conservative if the accessed pointer may alias the allocation -
+    // fallback to the generic handling below.
+    if (getBestAAResults().alias(MemoryLocation::getBeforeOrAfter(Call), Loc,
+                                 AAQI) == AliasResult::NoAlias)
+      return ModRefInfo::NoModRef;
+  }
+
   // Ideally, there should be no need to special case for memcpy/memove
   // intrinsics here since general machinery (based on memory attributes) should
   // already handle it just fine. Unfortunately, it doesn't due to deficiency in

diff  --git a/llvm/test/Transforms/GVN/nonescaping-malloc.ll b/llvm/test/Transforms/GVN/nonescaping-malloc.ll
index a2a7bda46f24b..fd61835e14a40 100644
--- a/llvm/test/Transforms/GVN/nonescaping-malloc.ll
+++ b/llvm/test/Transforms/GVN/nonescaping-malloc.ll
@@ -35,7 +35,7 @@ entry:
 
 declare i64 @strlen(i8* nocapture) nounwind readonly
 
-declare noalias i8* @malloc(i64) nounwind inaccessiblememonly
+declare noalias i8* @malloc(i64) nounwind
 
 declare i32 @_ZN4llvm13StringMapImpl15LookupBucketForENS_9StringRefE(%"struct.llvm::StringMapImpl"*, i64, i64)
 


        


More information about the llvm-commits mailing list