[PATCH] D20890: [CFLAA] Improving the precision of cfl-aa for inttoptr and ptrtoint

Jia Chen via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 1 16:51:24 PDT 2016


grievejia created this revision.
grievejia added reviewers: george.burgess.iv, hfinkel.
grievejia added a subscriber: llvm-commits.

Previously, pointers obtained from/to inttoptr/ptrtoint are treated like arguments and globals. According to the Pointer Aliasing Rule section in LLVM Language Reference, inttoptr-pointers can only alias with values that it depends on. Therefore, it is ok to be less conservative by handling inttoptr and ptrtoint in the same way as we handle bitcasts.

http://reviews.llvm.org/D20890

Files:
  lib/Analysis/CFLAliasAnalysis.cpp
  test/Analysis/CFLAliasAnalysis/int_ptr_cast.ll

Index: test/Analysis/CFLAliasAnalysis/int_ptr_cast.ll
===================================================================
--- test/Analysis/CFLAliasAnalysis/int_ptr_cast.ll
+++ test/Analysis/CFLAliasAnalysis/int_ptr_cast.ll
@@ -0,0 +1,31 @@
+; This testcase ensures that inttoptr pointer only aliases pointers that it depends on
+
+; RUN: opt < %s -disable-basicaa -cfl-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+; CHECK: Function: test_value_dep
+; CHECK: NoAlias: i64* %p, i64* %qcast
+; CHECK: MayAlias: i64* %q, i64* %qcast
+define void @test_value_dep(i64* %p, i64 %n) {
+  %q = alloca i64, align 8
+  %qint = ptrtoint i64* %q to i64
+  %qint2 = add nsw i64 %qint, %n
+  %qcast = inttoptr i64 %qint2 to i64*
+  ret void
+}
+
+; CHECK: Function: test_memory_dep
+; CHECK: NoAlias: i64* %p, i64* %qcast
+; CHECK: MayAlias: i64* %q, i64* %qcast
+; CHECK: NoAlias: i64* %qcast, i64* %r
+define void @test_memory_dep(i64* %p) {
+  %q = alloca i64, align 8
+  %qint = ptrtoint i64* %q to i64
+  
+  %r = alloca i64, align 8
+  store i64 %qint, i64* %r
+
+  %qint2 = load i64, i64* %r
+  %qcast = inttoptr i64 %qint2 to i64*
+  ret void
+}
Index: lib/Analysis/CFLAliasAnalysis.cpp
===================================================================
--- lib/Analysis/CFLAliasAnalysis.cpp
+++ lib/Analysis/CFLAliasAnalysis.cpp
@@ -103,13 +103,11 @@
 LLVM_CONSTEXPR unsigned MaxStratifiedAttrIndex = NumStratifiedAttrs;
 LLVM_CONSTEXPR unsigned AttrAllIndex = 0;
 LLVM_CONSTEXPR unsigned AttrGlobalIndex = 1;
-LLVM_CONSTEXPR unsigned AttrUnknownIndex = 2;
-LLVM_CONSTEXPR unsigned AttrFirstArgIndex = 3;
+LLVM_CONSTEXPR unsigned AttrFirstArgIndex = 2;
 LLVM_CONSTEXPR unsigned AttrLastArgIndex = MaxStratifiedAttrIndex;
 LLVM_CONSTEXPR unsigned AttrMaxNumArgs = AttrLastArgIndex - AttrFirstArgIndex;
 
 LLVM_CONSTEXPR StratifiedAttr AttrNone = 0;
-LLVM_CONSTEXPR StratifiedAttr AttrUnknown = 1 << AttrUnknownIndex;
 LLVM_CONSTEXPR StratifiedAttr AttrAll = ~AttrNone;
 
 /// StratifiedSets call for knowledge of "direction", so this is how we
@@ -175,12 +173,12 @@
 
   void visitPtrToIntInst(PtrToIntInst &Inst) {
     auto *Ptr = Inst.getOperand(0);
-    Output.push_back(Edge(Ptr, Ptr, EdgeType::Assign, AttrUnknown));
+    Output.push_back(Edge(&Inst, Ptr, EdgeType::Assign, AttrNone));
   }
 
   void visitIntToPtrInst(IntToPtrInst &Inst) {
-    auto *Ptr = &Inst;
-    Output.push_back(Edge(Ptr, Ptr, EdgeType::Assign, AttrUnknown));
+    auto *Src = Inst.getOperand(0);
+    Output.push_back(Edge(&Inst, Src, EdgeType::Assign, AttrNone));
   }
 
   void visitCastInst(CastInst &Inst) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20890.59306.patch
Type: text/x-patch
Size: 2742 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160601/08e966cc/attachment.bin>


More information about the llvm-commits mailing list