summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-08-16 06:13:46 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-08-16 06:13:46 +0000
commit5c5df6283a3452aefccdf1b54600bd3b0aaa36a2 (patch)
tree38e3612823b424872d080092c1f0b262a904479b /llvm
parent88c491ddec5bb8c5b087421f8f1f1239325beb45 (diff)
downloadbcm5719-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.cpp8
-rw-r--r--llvm/test/Transforms/InstSimplify/cast.ll27
-rw-r--r--llvm/test/Transforms/InstSimplify/compare.ll13
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
OpenPOWER on IntegriCloud