[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