forked from OSchip/llvm-project
[InstCombine] Fix IC trying to create a xor of pointer types.
rdar://42473741 Differential Revision: https://reviews.llvm.org/D50775 llvm-svn: 339796
This commit is contained in:
parent
cc2e8ccc6f
commit
070ac768ff
|
@ -2487,7 +2487,8 @@ Value *InstCombiner::foldXorOfICmps(ICmpInst *LHS, ICmpInst *RHS) {
|
|||
Value *LHS0 = LHS->getOperand(0), *LHS1 = LHS->getOperand(1);
|
||||
Value *RHS0 = RHS->getOperand(0), *RHS1 = RHS->getOperand(1);
|
||||
if ((LHS->hasOneUse() || RHS->hasOneUse()) &&
|
||||
LHS0->getType() == RHS0->getType()) {
|
||||
LHS0->getType() == RHS0->getType() &&
|
||||
LHS0->getType()->isIntOrIntVectorTy()) {
|
||||
// (X > -1) ^ (Y > -1) --> (X ^ Y) < 0
|
||||
// (X < 0) ^ (Y < 0) --> (X ^ Y) < 0
|
||||
if ((PredL == CmpInst::ICMP_SGT && match(LHS1, m_AllOnes()) &&
|
||||
|
|
|
@ -158,3 +158,16 @@ define i1 @test14(i8 %A, i8 %B) {
|
|||
ret i1 %E
|
||||
}
|
||||
|
||||
define i1 @xor_icmp_ptr(i8* %c, i8* %d) {
|
||||
; CHECK-LABEL: @xor_icmp_ptr(
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8* [[C:%.*]], null
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8* [[D:%.*]], null
|
||||
; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[CMP]], [[CMP1]]
|
||||
; CHECK-NEXT: ret i1 [[XOR]]
|
||||
;
|
||||
%cmp = icmp slt i8* %c, null
|
||||
%cmp1 = icmp slt i8* %d, null
|
||||
%xor = xor i1 %cmp, %cmp1
|
||||
ret i1 %xor
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue