<div dir="ltr">LGTM.<div><br></div><div>-Eli</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Sep 12, 2013 at 2:55 PM, Matt Arsenault <span dir="ltr"><<a href="mailto:Matthew.Arsenault@amd.com" target="_blank">Matthew.Arsenault@amd.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If address space 0 was smaller than the address space in a constant inttoptr/ptrtoint pair, the wrong mask size would be used.<br>

<br>
<a href="http://llvm-reviews.chandlerc.com/D1662" target="_blank">http://llvm-reviews.chandlerc.com/D1662</a><br>
<br>
Files:<br>
  lib/Analysis/ConstantFolding.cpp<br>
  test/Transforms/InstCombine/constant-fold-address-space-pointer.ll<br>
<br>
Index: lib/Analysis/ConstantFolding.cpp<br>
===================================================================<br>
--- lib/Analysis/ConstantFolding.cpp<br>
+++ lib/Analysis/ConstantFolding.cpp<br>
@@ -974,10 +974,11 @@<br>
       if (TD && CE->getOpcode() == Instruction::IntToPtr) {<br>
         Constant *Input = CE->getOperand(0);<br>
         unsigned InWidth = Input->getType()->getScalarSizeInBits();<br>
-        if (TD->getPointerTypeSizeInBits(CE->getType()) < InWidth) {<br>
+        unsigned PtrWidth = TD->getPointerTypeSizeInBits(CE->getType());<br>
+        if (PtrWidth < InWidth) {<br>
           Constant *Mask =<br>
-            ConstantInt::get(CE->getContext(), APInt::getLowBitsSet(InWidth,<br>
-                                                  TD->getPointerSizeInBits()));<br>
+            ConstantInt::get(CE->getContext(),<br>
+                             APInt::getLowBitsSet(InWidth, PtrWidth));<br>
           Input = ConstantExpr::getAnd(Input, Mask);<br>
         }<br>
         // Do a zext or trunc to get to the dest size.<br>
Index: test/Transforms/InstCombine/constant-fold-address-space-pointer.ll<br>
===================================================================<br>
--- test/Transforms/InstCombine/constant-fold-address-space-pointer.ll<br>
+++ test/Transforms/InstCombine/constant-fold-address-space-pointer.ll<br>
@@ -74,6 +74,14 @@<br>
   ret i8 ptrtoint (i32 addrspace(3)* inttoptr (i32 257 to i32 addrspace(3)*) to i8)<br>
 }<br>
<br>
+; Address space 0 is too small for the correct mask, should mask with<br>
+; 64-bits instead of 32<br>
+define i64 @const_fold_ptrtoint_mask_small_as0() {<br>
+; CHECK-LABEL: @const_fold_ptrtoint_mask_small_as0(<br>
+; CHECK: ret i64 -1<br>
+  ret i64 ptrtoint (i32 addrspace(1)* inttoptr (i128 -1 to i32 addrspace(1)*) to i64)<br>
+}<br>
+<br>
 define i32 addrspace(3)* @const_inttoptr() {<br>
 ; CHECK-LABEL: @const_inttoptr(<br>
 ; CHECK-NEXT: ret i32 addrspace(3)* inttoptr (i16 4 to i32 addrspace(3)*)<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div>