[llvm-commits] [llvm] r153418 - in /llvm/trunk: lib/Analysis/InstructionSimplify.cpp test/Transforms/InstSimplify/ptr_diff.ll

Chandler Carruth chandlerc at gmail.com
Sun Mar 25 13:43:07 PDT 2012


Author: chandlerc
Date: Sun Mar 25 15:43:07 2012
New Revision: 153418

URL: http://llvm.org/viewvc/llvm-project?rev=153418&view=rev
Log:
Switch the pointer-difference simplification logic to only work with
inbounds GEPs. This isn't really necessary for simplifying pointer
differences, but I'm planning to re-use the same code to simplify
pointer comparisons where it is necessary. Since real code almost
exclusively uses inbounds GEPs, it doesn't seem worth it to support the
extra complexity of turning it on and off. If anyone would like that
back, feel free to shout. Note that instcombine will still catch any of
these patterns.

Modified:
    llvm/trunk/lib/Analysis/InstructionSimplify.cpp
    llvm/trunk/test/Transforms/InstSimplify/ptr_diff.ll

Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=153418&r1=153417&r2=153418&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Sun Mar 25 15:43:07 2012
@@ -710,7 +710,7 @@
   Visited.insert(V);
   do {
     if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
-      if (!accumulateGEPOffset(TD, GEP, Offset))
+      if (!GEP->isInBounds() || !accumulateGEPOffset(TD, GEP, Offset))
         break;
       V = GEP->getPointerOperand();
     } else if (Operator::getOpcode(V) == Instruction::BitCast) {

Modified: llvm/trunk/test/Transforms/InstSimplify/ptr_diff.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/ptr_diff.ll?rev=153418&r1=153417&r2=153418&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/ptr_diff.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/ptr_diff.ll Sun Mar 25 15:43:07 2012
@@ -6,8 +6,8 @@
 ; CHECK: @ptrdiff1
 ; CHECK-NEXT: ret i64 42
 
-  %first = getelementptr i8* %ptr, i32 0
-  %last = getelementptr i8* %ptr, i32 42
+  %first = getelementptr inbounds i8* %ptr, i32 0
+  %last = getelementptr inbounds i8* %ptr, i32 42
   %first.int = ptrtoint i8* %first to i64
   %last.int = ptrtoint i8* %last to i64
   %diff = sub i64 %last.int, %first.int
@@ -18,16 +18,31 @@
 ; CHECK: @ptrdiff2
 ; CHECK-NEXT: ret i64 42
 
-  %first1 = getelementptr i8* %ptr, i32 0
-  %first2 = getelementptr i8* %first1, i32 1
-  %first3 = getelementptr i8* %first2, i32 2
-  %first4 = getelementptr i8* %first3, i32 4
-  %last1 = getelementptr i8* %first2, i32 48
-  %last2 = getelementptr i8* %last1, i32 8
-  %last3 = getelementptr i8* %last2, i32 -4
-  %last4 = getelementptr i8* %last3, i32 -4
+  %first1 = getelementptr inbounds i8* %ptr, i32 0
+  %first2 = getelementptr inbounds i8* %first1, i32 1
+  %first3 = getelementptr inbounds i8* %first2, i32 2
+  %first4 = getelementptr inbounds i8* %first3, i32 4
+  %last1 = getelementptr inbounds i8* %first2, i32 48
+  %last2 = getelementptr inbounds i8* %last1, i32 8
+  %last3 = getelementptr inbounds i8* %last2, i32 -4
+  %last4 = getelementptr inbounds i8* %last3, i32 -4
   %first.int = ptrtoint i8* %first4 to i64
   %last.int = ptrtoint i8* %last4 to i64
   %diff = sub i64 %last.int, %first.int
   ret i64 %diff
 }
+
+define i64 @ptrdiff3(i8* %ptr) {
+; Don't bother with non-inbounds GEPs.
+; CHECK: @ptrdiff3
+; CHECK: getelementptr
+; CHECK: sub
+; CHECK: ret
+
+  %first = getelementptr i8* %ptr, i32 0
+  %last = getelementptr i8* %ptr, i32 42
+  %first.int = ptrtoint i8* %first to i64
+  %last.int = ptrtoint i8* %last to i64
+  %diff = sub i64 %last.int, %first.int
+  ret i64 %diff
+}





More information about the llvm-commits mailing list