mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[InstSimplify] Fold gep (gep V, C), (xor V, -1) to C-1
llvm-svn: 278779
This commit is contained in:
parent
d3333b5982
commit
4ca4b42bf0
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user