mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
remove the instcombine transformations that are inserting nasty
pointer to int casts that confuse later optimizations. See PR3351 for details. This improves but doesn't complete fix 483.xalancbmk because llvm-gcc does this xform in GCC's "fold" routine as well. Clang++ will do better I guess. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92408 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
09987f73f6
commit
0b178e25c4
@ -4166,21 +4166,6 @@ Value *InstCombiner::FoldLogicalPlusAnd(Value *LHS, Value *RHS,
|
||||
/// FoldAndOfICmps - Fold (icmp)&(icmp) if possible.
|
||||
Instruction *InstCombiner::FoldAndOfICmps(Instruction &I,
|
||||
ICmpInst *LHS, ICmpInst *RHS) {
|
||||
// (icmp eq A, null) & (icmp eq B, null) -->
|
||||
// (icmp eq (ptrtoint(A)|ptrtoint(B)), 0)
|
||||
if (TD &&
|
||||
LHS->getPredicate() == ICmpInst::ICMP_EQ &&
|
||||
RHS->getPredicate() == ICmpInst::ICMP_EQ &&
|
||||
isa<ConstantPointerNull>(LHS->getOperand(1)) &&
|
||||
isa<ConstantPointerNull>(RHS->getOperand(1))) {
|
||||
const Type *IntPtrTy = TD->getIntPtrType(I.getContext());
|
||||
Value *A = Builder->CreatePtrToInt(LHS->getOperand(0), IntPtrTy);
|
||||
Value *B = Builder->CreatePtrToInt(RHS->getOperand(0), IntPtrTy);
|
||||
Value *NewOr = Builder->CreateOr(A, B);
|
||||
return new ICmpInst(ICmpInst::ICMP_EQ, NewOr,
|
||||
Constant::getNullValue(IntPtrTy));
|
||||
}
|
||||
|
||||
Value *Val, *Val2;
|
||||
ConstantInt *LHSCst, *RHSCst;
|
||||
ICmpInst::Predicate LHSCC, RHSCC;
|
||||
@ -4861,21 +4846,6 @@ static Instruction *MatchSelectFromAndOr(Value *A, Value *B,
|
||||
/// FoldOrOfICmps - Fold (icmp)|(icmp) if possible.
|
||||
Instruction *InstCombiner::FoldOrOfICmps(Instruction &I,
|
||||
ICmpInst *LHS, ICmpInst *RHS) {
|
||||
// (icmp ne A, null) | (icmp ne B, null) -->
|
||||
// (icmp ne (ptrtoint(A)|ptrtoint(B)), 0)
|
||||
if (TD &&
|
||||
LHS->getPredicate() == ICmpInst::ICMP_NE &&
|
||||
RHS->getPredicate() == ICmpInst::ICMP_NE &&
|
||||
isa<ConstantPointerNull>(LHS->getOperand(1)) &&
|
||||
isa<ConstantPointerNull>(RHS->getOperand(1))) {
|
||||
const Type *IntPtrTy = TD->getIntPtrType(I.getContext());
|
||||
Value *A = Builder->CreatePtrToInt(LHS->getOperand(0), IntPtrTy);
|
||||
Value *B = Builder->CreatePtrToInt(RHS->getOperand(0), IntPtrTy);
|
||||
Value *NewOr = Builder->CreateOr(A, B);
|
||||
return new ICmpInst(ICmpInst::ICMP_NE, NewOr,
|
||||
Constant::getNullValue(IntPtrTy));
|
||||
}
|
||||
|
||||
Value *Val, *Val2;
|
||||
ConstantInt *LHSCst, *RHSCst;
|
||||
ICmpInst::Predicate LHSCC, RHSCC;
|
||||
|
@ -268,21 +268,6 @@ define i1 @test26(i32 %A, i32 %B) {
|
||||
; CHECK: ret i1
|
||||
}
|
||||
|
||||
; PR5634
|
||||
define i1 @test27(i32* %A, i32* %B) {
|
||||
%C1 = icmp eq i32* %A, null
|
||||
%C2 = icmp eq i32* %B, null
|
||||
; (A == 0) & (A == 0) --> (A|B) == 0
|
||||
%D = and i1 %C1, %C2
|
||||
ret i1 %D
|
||||
; CHECK: @test27
|
||||
; CHECK: ptrtoint i32* %A
|
||||
; CHECK: ptrtoint i32* %B
|
||||
; CHECK: or i32
|
||||
; CHECK: icmp eq i32 {{.*}}, 0
|
||||
; CHECK: ret i1
|
||||
}
|
||||
|
||||
; PR5634
|
||||
define i1 @test28(i32 %A, i32 %B) {
|
||||
%C1 = icmp ne i32 %A, 0
|
||||
|
Loading…
Reference in New Issue
Block a user