[llvm] r278779 - [InstSimplify] Fold gep (gep V, C), (xor V, -1) to C-1

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 15 23:13:46 PDT 2016


Author: majnemer
Date: Tue Aug 16 01:13:46 2016
New Revision: 278779

URL: http://llvm.org/viewvc/llvm-project?rev=278779&view=rev
Log:
[InstSimplify] Fold gep (gep V, C), (xor V, -1) to C-1

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

Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=278779&r1=278778&r2=278779&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Tue Aug 16 01:13:46 2016
@@ -3645,7 +3645,6 @@ static Value *SimplifyGEPInst(Type *SrcT
     }
   }
 
-  // gep (gep V, C), (sub 0, V) -> C
   if (Q.DL.getTypeAllocSize(LastType) == 1 &&
       all_of(Ops.slice(1).drop_back(1),
              [](Value *Idx) { return match(Idx, m_Zero()); })) {
@@ -3657,11 +3656,18 @@ static Value *SimplifyGEPInst(Type *SrcT
           Ops[0]->stripAndAccumulateInBoundsConstantOffsets(Q.DL,
                                                             BasePtrOffset);
 
+      // gep (gep V, C), (sub 0, V) -> C
       if (match(Ops.back(),
                 m_Sub(m_Zero(), m_PtrToInt(m_Specific(StrippedBasePtr))))) {
         auto *CI = ConstantInt::get(GEPTy->getContext(), BasePtrOffset);
         return ConstantExpr::getIntToPtr(CI, GEPTy);
       }
+      // gep (gep V, C), (xor V, -1) -> C-1
+      if (match(Ops.back(),
+                m_Xor(m_PtrToInt(m_Specific(StrippedBasePtr)), m_AllOnes()))) {
+        auto *CI = ConstantInt::get(GEPTy->getContext(), BasePtrOffset - 1);
+        return ConstantExpr::getIntToPtr(CI, GEPTy);
+      }
     }
   }
 

Modified: llvm/trunk/test/Transforms/InstSimplify/cast.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/cast.ll?rev=278779&r1=278778&r2=278779&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/cast.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/cast.ll Tue Aug 16 01:13:46 2016
@@ -1,4 +1,5 @@
 ; RUN: opt -S -instsimplify < %s | FileCheck %s
+target datalayout = "p:32:32"
 
 define i1 @test1(i1 %V) {
 entry:
@@ -25,3 +26,29 @@ entry:
 ; CHECK-LABEL: define i8* @test3(
 ; CHECK: ret i8* %V
 }
+
+define i32 @test4() {
+; CHECK-LABEL: @test4(
+  %alloca = alloca i32, align 4                                     ; alloca + 0
+  %gep = getelementptr inbounds i32, i32* %alloca, i32 1            ; alloca + 4
+  %bc = bitcast i32* %gep to [4 x i8]*                              ; alloca + 4
+  %pti = ptrtoint i32* %alloca to i32                               ; alloca
+  %sub = sub i32 0, %pti                                            ; -alloca
+  %add = getelementptr [4 x i8], [4 x i8]* %bc, i32 0, i32 %sub     ; alloca + 4 - alloca == 4
+  %add_to_int = ptrtoint i8* %add to i32                            ; 4
+  ret i32 %add_to_int                                               ; 4
+; CHECK-NEXT: ret i32 4
+}
+
+define i32 @test5() {
+; CHECK-LABEL: @test5(
+  %alloca = alloca i32, align 4                                     ; alloca + 0
+  %gep = getelementptr inbounds i32, i32* %alloca, i32 1            ; alloca + 4
+  %bc = bitcast i32* %gep to [4 x i8]*                              ; alloca + 4
+  %pti = ptrtoint i32* %alloca to i32                               ; alloca
+  %sub = xor i32 %pti, -1                                           ; ~alloca
+  %add = getelementptr [4 x i8], [4 x i8]* %bc, i32 0, i32 %sub     ; alloca + 4 - alloca - 1 == 3
+  %add_to_int = ptrtoint i8* %add to i32                            ; 4
+  ret i32 %add_to_int                                               ; 4
+; CHECK-NEXT: ret i32 3
+}

Modified: llvm/trunk/test/Transforms/InstSimplify/compare.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/compare.ll?rev=278779&r1=278778&r2=278779&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/compare.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/compare.ll Tue Aug 16 01:13:46 2016
@@ -219,19 +219,6 @@ define i1 @gep17() {
 ; CHECK-NEXT: ret i1 true
 }
 
-define i32 @gep18() {
-; CHECK-LABEL: @gep18(
-  %alloca = alloca i32, align 4                                     ; alloca + 0
-  %gep = getelementptr inbounds i32, i32* %alloca, i32 1            ; alloca + 4
-  %bc = bitcast i32* %gep to [4 x i8]*                              ; alloca + 4
-  %pti = ptrtoint i32* %alloca to i32                               ; alloca
-  %sub = sub i32 0, %pti                                            ; -alloca
-  %add = getelementptr [4 x i8], [4 x i8]* %bc, i32 0, i32 %sub     ; alloca + 4 - alloca == 4
-  %add_to_int = ptrtoint i8* %add to i32                            ; 4
-  ret i32 %add_to_int                                               ; 4
-; CHECK-NEXT: ret i32 4
-}
-
 define i1 @zext(i32 %x) {
 ; CHECK-LABEL: @zext(
   %e1 = zext i32 %x to i64




More information about the llvm-commits mailing list