[PATCH] Add address space arguments to MemoryBuiltins

Matt Arsenault Matthew.Arsenault at amd.com
Fri Sep 13 18:11:04 PDT 2013


http://llvm-reviews.chandlerc.com/D1463 depends on this

http://llvm-reviews.chandlerc.com/D1685

Files:
  include/llvm/Analysis/MemoryBuiltins.h
  lib/Analysis/MemoryBuiltins.cpp
  lib/Transforms/Instrumentation/BoundsChecking.cpp
  test/Transforms/InstCombine/objsize-address-space.ll

Index: include/llvm/Analysis/MemoryBuiltins.h
===================================================================
--- include/llvm/Analysis/MemoryBuiltins.h
+++ include/llvm/Analysis/MemoryBuiltins.h
@@ -169,8 +169,11 @@
   }
 
 public:
-  ObjectSizeOffsetVisitor(const DataLayout *DL, const TargetLibraryInfo *TLI,
-                          LLVMContext &Context, bool RoundToAlign = false);
+  ObjectSizeOffsetVisitor(const DataLayout *DL,
+                          const TargetLibraryInfo *TLI,
+                          LLVMContext &Context,
+                          bool RoundToAlign = false,
+                          unsigned AS = 0);
 
   SizeOffsetType compute(Value *V);
 
@@ -231,8 +234,10 @@
   SizeOffsetEvalType compute_(Value *V);
 
 public:
-  ObjectSizeOffsetEvaluator(const DataLayout *DL, const TargetLibraryInfo *TLI,
-                            LLVMContext &Context);
+  ObjectSizeOffsetEvaluator(const DataLayout *DL,
+                            const TargetLibraryInfo *TLI,
+                            LLVMContext &Context,
+                            unsigned AS = 0);
   SizeOffsetEvalType compute(Value *V);
 
   bool knownSize(SizeOffsetEvalType SizeOffset) {
Index: lib/Analysis/MemoryBuiltins.cpp
===================================================================
--- lib/Analysis/MemoryBuiltins.cpp
+++ lib/Analysis/MemoryBuiltins.cpp
@@ -359,7 +359,8 @@
   if (!DL)
     return false;
 
-  ObjectSizeOffsetVisitor Visitor(DL, TLI, Ptr->getContext(), RoundToAlign);
+  unsigned AS = Ptr->getType()->getPointerAddressSpace();
+  ObjectSizeOffsetVisitor Visitor(DL, TLI, Ptr->getContext(), RoundToAlign, AS);
   SizeOffsetType Data = Visitor.compute(const_cast<Value*>(Ptr));
   if (!Visitor.bothKnown(Data))
     return false;
@@ -389,9 +390,11 @@
 ObjectSizeOffsetVisitor::ObjectSizeOffsetVisitor(const DataLayout *DL,
                                                  const TargetLibraryInfo *TLI,
                                                  LLVMContext &Context,
-                                                 bool RoundToAlign)
+                                                 bool RoundToAlign,
+                                                 unsigned AS)
+
 : DL(DL), TLI(TLI), RoundToAlign(RoundToAlign) {
-  IntegerType *IntTy = DL->getIntPtrType(Context);
+  IntegerType *IntTy = DL->getIntPtrType(Context, AS);
   IntTyBits = IntTy->getBitWidth();
   Zero = APInt::getNullValue(IntTyBits);
 }
@@ -580,9 +583,10 @@
 
 ObjectSizeOffsetEvaluator::ObjectSizeOffsetEvaluator(const DataLayout *DL,
                                                      const TargetLibraryInfo *TLI,
-                                                     LLVMContext &Context)
+                                                     LLVMContext &Context,
+                                                     unsigned AS)
 : DL(DL), TLI(TLI), Context(Context), Builder(Context, TargetFolder(DL)) {
-  IntTy = DL->getIntPtrType(Context);
+  IntTy = DL->getIntPtrType(Context, AS);
   Zero = ConstantInt::get(IntTy, 0);
 }
 
Index: lib/Transforms/Instrumentation/BoundsChecking.cpp
===================================================================
--- lib/Transforms/Instrumentation/BoundsChecking.cpp
+++ lib/Transforms/Instrumentation/BoundsChecking.cpp
@@ -173,6 +173,8 @@
   TrapBB = 0;
   BuilderTy TheBuilder(F.getContext(), TargetFolder(TD));
   Builder = &TheBuilder;
+
+  // FIXME: This doesn't get the address space
   ObjectSizeOffsetEvaluator TheObjSizeEval(TD, TLI, F.getContext());
   ObjSizeEval = &TheObjSizeEval;
 
Index: test/Transforms/InstCombine/objsize-address-space.ll
===================================================================
--- /dev/null
+++ test/Transforms/InstCombine/objsize-address-space.ll
@@ -0,0 +1,54 @@
+; RUN: opt -S -instcombine -o - %s | FileCheck %s
+target datalayout = "e-p:32:32:32-p1:64:64:64-p2:8:8:8-p3:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32"
+
+declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly
+
+ at array_as2 = private addrspace(2) global [60 x i8] zeroinitializer, align 4
+
+ at array_as1_pointers = private global [10 x i32 addrspace(1)*] zeroinitializer, align 4
+ at array_as2_pointers = private global [24 x i32 addrspace(2)*] zeroinitializer, align 4
+ at array_as3_pointers = private global [42 x i32 addrspace(3)*] zeroinitializer, align 4
+
+
+ at array_as2_as1_pointer_pointers = private global [16 x i32 addrspace(2)* addrspace(1)*] zeroinitializer, align 4
+
+
+define i32 @array_as2_size() {
+; CHECK: @array_as2_size
+; CHECK-NEXT: ret i32 60
+  %bc = bitcast [60 x i8] addrspace(2)* @array_as2 to i8*
+  %1 = call i32 @llvm.objectsize.i32(i8* %bc, i1 false)
+  ret i32 %1
+}
+
+define i32 @pointer_array_as1() {
+; CHECK: @pointer_array_as1
+; CHECK-NEXT: ret i32 80
+  %bc = bitcast [10 x i32 addrspace(1)*]* @array_as1_pointers to i8*
+  %1 = call i32 @llvm.objectsize.i32(i8* %bc, i1 false)
+  ret i32 %1
+}
+
+define i32 @pointer_array_as2() {
+; CHECK: @pointer_array_as2
+; CHECK-NEXT: ret i32 24
+  %bc = bitcast [24 x i32 addrspace(2)*]* @array_as2_pointers to i8*
+  %1 = call i32 @llvm.objectsize.i32(i8* %bc, i1 false)
+  ret i32 %1
+}
+
+define i32 @pointer_array_as3() {
+; CHECK: @pointer_array_as3
+; CHECK-NEXT: ret i32 84
+  %bc = bitcast [42 x i32 addrspace(3)*]* @array_as3_pointers to i8*
+  %1 = call i32 @llvm.objectsize.i32(i8* %bc, i1 false)
+  ret i32 %1
+}
+
+define i32 @pointer_pointer_array_as2_as1() {
+; CHECK: @pointer_pointer_array_as2_as1
+; CHECK-NEXT: ret i32 128
+  %bc = bitcast [16 x i32 addrspace(2)* addrspace(1)*]* @array_as2_as1_pointer_pointers to i8*
+  %1 = call i32 @llvm.objectsize.i32(i8* %bc, i1 false)
+  ret i32 %1
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1685.1.patch
Type: text/x-patch
Size: 5689 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130913/03c7fca5/attachment.bin>


More information about the llvm-commits mailing list