diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-08-16 06:13:46 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-08-16 06:13:46 +0000 |
commit | 5c5df6283a3452aefccdf1b54600bd3b0aaa36a2 (patch) | |
tree | 38e3612823b424872d080092c1f0b262a904479b /llvm | |
parent | 88c491ddec5bb8c5b087421f8f1f1239325beb45 (diff) | |
download | bcm5719-llvm-5c5df6283a3452aefccdf1b54600bd3b0aaa36a2.tar.gz bcm5719-llvm-5c5df6283a3452aefccdf1b54600bd3b0aaa36a2.zip |
[InstSimplify] Fold gep (gep V, C), (xor V, -1) to C-1
llvm-svn: 278779
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 8 | ||||
-rw-r--r-- | llvm/test/Transforms/InstSimplify/cast.ll | 27 | ||||
-rw-r--r-- | llvm/test/Transforms/InstSimplify/compare.ll | 13 |
3 files changed, 34 insertions, 14 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 95273a78897..3a1b272a0e7 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -3645,7 +3645,6 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops, } } - // 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 *SrcTy, ArrayRef<Value *> Ops, 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); + } } } diff --git a/llvm/test/Transforms/InstSimplify/cast.ll b/llvm/test/Transforms/InstSimplify/cast.ll index a656854478d..1ba3c76d023 100644 --- a/llvm/test/Transforms/InstSimplify/cast.ll +++ b/llvm/test/Transforms/InstSimplify/cast.ll @@ -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 +} diff --git a/llvm/test/Transforms/InstSimplify/compare.ll b/llvm/test/Transforms/InstSimplify/compare.ll index 39e71c8c7ac..bf22dbda4f1 100644 --- a/llvm/test/Transforms/InstSimplify/compare.ll +++ b/llvm/test/Transforms/InstSimplify/compare.ll @@ -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 |