[PATCH] Handle address spaces in TargetTransformInfo

Matt Arsenault Matthew.Arsenault at amd.com
Wed Aug 21 13:01:30 PDT 2013


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

Files:
  lib/Analysis/TargetTransformInfo.cpp
  test/Transforms/Inline/ptr-diff.ll

Index: lib/Analysis/TargetTransformInfo.cpp
===================================================================
--- lib/Analysis/TargetTransformInfo.cpp
+++ lib/Analysis/TargetTransformInfo.cpp
@@ -265,26 +265,34 @@
       // Otherwise, the default basic cost is used.
       return TCC_Basic;
 
-    case Instruction::IntToPtr:
+    case Instruction::IntToPtr: {
+      if (!DL)
+        return TCC_Basic;
+
       // An inttoptr cast is free so long as the input is a legal integer type
       // which doesn't contain values outside the range of a pointer.
-      if (DL && DL->isLegalInteger(OpTy->getScalarSizeInBits()) &&
-          OpTy->getScalarSizeInBits() <= DL->getPointerSizeInBits())
+      unsigned OpSize = OpTy->getScalarSizeInBits();
+      if (DL->isLegalInteger(OpSize) &&
+          OpSize <= DL->getPointerTypeSizeInBits(Ty))
         return TCC_Free;
 
       // Otherwise it's not a no-op.
       return TCC_Basic;
+    }
+    case Instruction::PtrToInt: {
+      if (!DL)
+        return TCC_Basic;
 
-    case Instruction::PtrToInt:
       // A ptrtoint cast is free so long as the result is large enough to store
       // the pointer, and a legal integer type.
-      if (DL && DL->isLegalInteger(Ty->getScalarSizeInBits()) &&
-          Ty->getScalarSizeInBits() >= DL->getPointerSizeInBits())
+      unsigned DestSize = Ty->getScalarSizeInBits();
+      if (DL->isLegalInteger(DestSize) &&
+          DestSize >= DL->getPointerTypeSizeInBits(OpTy))
         return TCC_Free;
 
       // Otherwise it's not a no-op.
       return TCC_Basic;
-
+    }
     case Instruction::Trunc:
       // trunc to a native type is free (assuming the target has compare and
       // shift-right of the same width).
Index: test/Transforms/Inline/ptr-diff.ll
===================================================================
--- test/Transforms/Inline/ptr-diff.ll
+++ test/Transforms/Inline/ptr-diff.ll
@@ -56,6 +56,34 @@
   ret i32 %t
 }
 
+define i32 @outer_inttoptr_as_cost(i32 addrspace(1)* %ptr) {
+; CHECK-LABEL: @outer_inttoptr_as_cost(
+; CHECK: call
+; CHECK: ret i32
+  %ptr1 = getelementptr inbounds i32 addrspace(1)* %ptr, i32 0
+  %ptr2 = getelementptr inbounds i32 addrspace(1)* %ptr, i32 42
+  %int1 = ptrtoint i32 addrspace(1)* %ptr1 to i32
+  %int2 = ptrtoint i32 addrspace(1)* %ptr2 to i32
+  %result = call i32 @inner_inttoptr_as_cost(i32 %int1, i32 %int2)
+  ret i32 %result
+}
+
+; Test that the operation cost for inttoptr is hit
+define i32 @inner_inttoptr_as_cost(i32 %begin, i32 %end) {
+  %distance = sub i32 %end, %begin
+  %begin.p = inttoptr i32 %begin to i32 addrspace(1)*
+  %end.p = inttoptr i32 %end to i32 addrspace(1)*
+  %icmp = icmp sle i32 %distance, 42
+  br i1 %icmp, label %then, label %else
+
+then:
+  ret i32 3
+
+else:
+  %t = load i32 addrspace(1)* %begin.p
+  ret i32 %t
+}
+
 ; Make sure that assertion isn't hit when ptrtoint is used with an
 ; integer size different from the pointer size
 define i32 @outer1_ptrtoint_larger() {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1464.1.patch
Type: text/x-patch
Size: 2993 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130821/ba994729/attachment.bin>


More information about the llvm-commits mailing list