From a8066d3a6f4fc8c4426877e8625303b0bd514e95 Mon Sep 17 00:00:00 2001 From: Jakub Jirutka Date: Sat, 22 Apr 2017 20:14:54 +0000 Subject: community/llvm3.9: move from testing --- community/llvm3.9/rust-lang-llvm-pr47.patch | 272 ++++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 community/llvm3.9/rust-lang-llvm-pr47.patch (limited to 'community/llvm3.9/rust-lang-llvm-pr47.patch') diff --git a/community/llvm3.9/rust-lang-llvm-pr47.patch b/community/llvm3.9/rust-lang-llvm-pr47.patch new file mode 100644 index 0000000000..245706827d --- /dev/null +++ b/community/llvm3.9/rust-lang-llvm-pr47.patch @@ -0,0 +1,272 @@ +From ae32815f9281a5a8d48014e180901fcdb658285a Mon Sep 17 00:00:00 2001 +From: David Majnemer +Date: Sun, 7 Aug 2016 07:58:00 +0000 +Subject: [rust-lang/llvm#47 1/4] [InstCombine] Infer inbounds on geps of + allocas + +git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277950 91177308-0d34-0410-b5e6-96231b3b80d8 +--- + lib/Transforms/InstCombine/InstructionCombining.cpp | 19 +++++++++++++++++++ + test/Transforms/InstCombine/getelementptr.ll | 6 +++--- + 2 files changed, 22 insertions(+), 3 deletions(-) + +diff --git a/lib/Transforms/InstCombine/InstructionCombining.cpp b/lib/Transforms/InstCombine/InstructionCombining.cpp +index 377ccb9c37f7..31b5ad6ae8af 100644 +--- a/lib/Transforms/InstCombine/InstructionCombining.cpp ++++ b/lib/Transforms/InstCombine/InstructionCombining.cpp +@@ -1898,6 +1898,25 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { + } + } + ++ if (!GEP.isInBounds()) { ++ unsigned PtrWidth = ++ DL.getPointerSizeInBits(PtrOp->getType()->getPointerAddressSpace()); ++ APInt BasePtrOffset(PtrWidth, 0); ++ Value *UnderlyingPtrOp = ++ PtrOp->stripAndAccumulateInBoundsConstantOffsets(DL, ++ BasePtrOffset); ++ if (auto *AI = dyn_cast(UnderlyingPtrOp)) { ++ if (GEP.accumulateConstantOffset(DL, BasePtrOffset) && ++ BasePtrOffset.isNonNegative()) { ++ APInt AllocSize(PtrWidth, DL.getTypeAllocSize(AI->getAllocatedType())); ++ if (BasePtrOffset.ule(AllocSize)) { ++ return GetElementPtrInst::CreateInBounds( ++ PtrOp, makeArrayRef(Ops).slice(1), GEP.getName()); ++ } ++ } ++ } ++ } ++ + return nullptr; + } + +diff --git a/test/Transforms/InstCombine/getelementptr.ll b/test/Transforms/InstCombine/getelementptr.ll +index 7446734e210c..14abd84fd18e 100644 +--- a/test/Transforms/InstCombine/getelementptr.ll ++++ b/test/Transforms/InstCombine/getelementptr.ll +@@ -366,7 +366,7 @@ define i32 @test21() { + %rval = load i32, i32* %pbobel + ret i32 %rval + ; CHECK-LABEL: @test21( +-; CHECK: getelementptr %intstruct, %intstruct* %pbob1, i64 0, i32 0 ++; CHECK: getelementptr inbounds %intstruct, %intstruct* %pbob1, i64 0, i32 0 + } + + +@@ -540,8 +540,8 @@ define i8* @test32(i8* %v) { + %G = load i8*, i8** %F + ret i8* %G + ; CHECK-LABEL: @test32( +-; CHECK: %D = getelementptr [4 x i8*], [4 x i8*]* %A, i64 0, i64 1 +-; CHECK: %F = getelementptr [4 x i8*], [4 x i8*]* %A, i64 0, i64 2 ++; CHECK: %D = getelementptr inbounds [4 x i8*], [4 x i8*]* %A, i64 0, i64 1 ++; CHECK: %F = getelementptr inbounds [4 x i8*], [4 x i8*]* %A, i64 0, i64 2 + } + + ; PR3290 +-- +2.7.4 + +From d31c987130ff1bf9cea9a287195ecceda91c37d1 Mon Sep 17 00:00:00 2001 +From: David Majnemer +Date: Sun, 7 Aug 2016 07:58:10 +0000 +Subject: [rust-lang/llvm#47 2/4] [InstSimplify] Try hard to simplify pointer + comparisons + +Simplify ptrtoint comparisons involving operands with different source +types. + +git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277951 91177308-0d34-0410-b5e6-96231b3b80d8 +--- + lib/Analysis/InstructionSimplify.cpp | 10 ++++++++++ + test/Transforms/InstSimplify/compare.ll | 13 +++++++++++++ + 2 files changed, 23 insertions(+) + +diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp +index 7c6edbfca270..8b70d89d62cb 100644 +--- a/lib/Analysis/InstructionSimplify.cpp ++++ b/lib/Analysis/InstructionSimplify.cpp +@@ -3092,6 +3092,16 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, + if (LHS->getType()->isPointerTy()) + if (auto *C = computePointerICmp(Q.DL, Q.TLI, Q.DT, Pred, Q.CxtI, LHS, RHS)) + return C; ++ if (auto *CLHS = dyn_cast(LHS)) ++ if (auto *CRHS = dyn_cast(RHS)) ++ if (Q.DL.getTypeSizeInBits(CLHS->getPointerOperandType()) == ++ Q.DL.getTypeSizeInBits(CLHS->getType()) && ++ Q.DL.getTypeSizeInBits(CRHS->getPointerOperandType()) == ++ Q.DL.getTypeSizeInBits(CRHS->getType())) ++ if (auto *C = computePointerICmp(Q.DL, Q.TLI, Q.DT, Pred, Q.CxtI, ++ CLHS->getPointerOperand(), ++ CRHS->getPointerOperand())) ++ return C; + + if (GetElementPtrInst *GLHS = dyn_cast(LHS)) { + if (GEPOperator *GRHS = dyn_cast(RHS)) { +diff --git a/test/Transforms/InstSimplify/compare.ll b/test/Transforms/InstSimplify/compare.ll +index 9d6fd74ae56f..3e7316ec6b48 100644 +--- a/test/Transforms/InstSimplify/compare.ll ++++ b/test/Transforms/InstSimplify/compare.ll +@@ -205,6 +205,19 @@ define i1 @gep16(i8* %ptr, i32 %a) { + ; CHECK-NEXT: ret i1 false + } + ++define i1 @gep17() { ++; CHECK-LABEL: @gep17( ++ %alloca = alloca i32, align 4 ++ %bc = bitcast i32* %alloca to [4 x i8]* ++ %gep1 = getelementptr inbounds i32, i32* %alloca, i32 1 ++ %pti1 = ptrtoint i32* %gep1 to i32 ++ %gep2 = getelementptr inbounds [4 x i8], [4 x i8]* %bc, i32 0, i32 1 ++ %pti2 = ptrtoint i8* %gep2 to i32 ++ %cmp = icmp ugt i32 %pti1, %pti2 ++ ret i1 %cmp ++; CHECK-NEXT: ret i1 true ++} ++ + define i1 @zext(i32 %x) { + ; CHECK-LABEL: @zext( + %e1 = zext i32 %x to i64 +-- +2.7.4 + +From bd3e05cb1f5293635edff14fcf23cfc73985c977 Mon Sep 17 00:00:00 2001 +From: David Majnemer +Date: Sun, 7 Aug 2016 07:58:12 +0000 +Subject: [rust-lang/llvm#47 3/4] [InstSimplify] Fold gep (gep V, C), (sub 0, + V) to C + +git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277952 91177308-0d34-0410-b5e6-96231b3b80d8 +--- + lib/Analysis/InstructionSimplify.cpp | 20 ++++++++++++++++++++ + test/Transforms/InstSimplify/compare.ll | 13 +++++++++++++ + 2 files changed, 33 insertions(+) + +diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp +index 8b70d89d62cb..9d2a47957125 100644 +--- a/lib/Analysis/InstructionSimplify.cpp ++++ b/lib/Analysis/InstructionSimplify.cpp +@@ -3597,6 +3597,26 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef 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()); })) { ++ unsigned PtrWidth = ++ Q.DL.getPointerSizeInBits(Ops[0]->getType()->getPointerAddressSpace()); ++ if (Q.DL.getTypeSizeInBits(Ops.back()->getType()) == PtrWidth) { ++ APInt BasePtrOffset(PtrWidth, 0); ++ Value *StrippedBasePtr = ++ Ops[0]->stripAndAccumulateInBoundsConstantOffsets(Q.DL, ++ BasePtrOffset); ++ ++ 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); ++ } ++ } ++ } ++ + // Check to see if this is constant foldable. + for (unsigned i = 0, e = Ops.size(); i != e; ++i) + if (!isa(Ops[i])) +diff --git a/test/Transforms/InstSimplify/compare.ll b/test/Transforms/InstSimplify/compare.ll +index 3e7316ec6b48..addb63c57222 100644 +--- a/test/Transforms/InstSimplify/compare.ll ++++ b/test/Transforms/InstSimplify/compare.ll +@@ -218,6 +218,19 @@ 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 +-- +2.7.4 + +From c3eb3c7608f439231d0c1340af6b720f113b4bf4 Mon Sep 17 00:00:00 2001 +From: David Majnemer +Date: Tue, 16 Aug 2016 06:13:46 +0000 +Subject: [rust-lang/llvm#47 4/4] [InstSimplify] Fold gep (gep V, C), (xor V, + -1) to C-1 + +git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278779 91177308-0d34-0410-b5e6-96231b3b80d8 +--- + lib/Analysis/InstructionSimplify.cpp | 8 +++++++- + test/Transforms/InstSimplify/compare.ll | 13 ------------- + 2 files changed, 7 insertions(+), 14 deletions(-) + +diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp +index 9d2a47957125..f7a435d1ad46 100644 +--- a/lib/Analysis/InstructionSimplify.cpp ++++ b/lib/Analysis/InstructionSimplify.cpp +@@ -3597,7 +3597,6 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef 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()); })) { +@@ -3609,11 +3608,18 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef 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/test/Transforms/InstSimplify/compare.ll b/test/Transforms/InstSimplify/compare.ll +index addb63c57222..3e7316ec6b48 100644 +--- a/test/Transforms/InstSimplify/compare.ll ++++ b/test/Transforms/InstSimplify/compare.ll +@@ -218,19 +218,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 +-- +2.7.4 + -- cgit v1.2.3