Index: llvm/test/Transforms/InstCombine/icmp-or.ll =================================================================== --- llvm/test/Transforms/InstCombine/icmp-or.ll +++ llvm/test/Transforms/InstCombine/icmp-or.ll @@ -363,3 +363,78 @@ %r = icmp sgt i8 %or, -1 ret i1 %r } + +define i1 @icmp_or_xor_2(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { +; CHECK-LABEL: @icmp_or_xor_2( +; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 %y2, %x2 +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 %y1, %x1 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP1]], [[TMP2]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %xor = xor i64 %y1, %x1 + %xor1 = xor i64 %y2, %x2 + %or = or i64 %xor1, %xor + %cmp = icmp eq i64 %or, 0 + ret i1 %cmp +} + +define i1 @icmp_or_xor_3_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { +; CHECK-LABEL: @icmp_or_xor_3_1( +; CHECK-NEXT: [[XOR1:%.*]] = xor i64 %y1, %x1 +; CHECK-NEXT: [[XOR2:%.*]] = xor i64 %y2, %x2 +; CHECK-NEXT: [[OR1:%.*]] = or i64 [[XOR2]], [[XOR1]] +; CHECK-NEXT: [[XOR3:%.*]] = xor i64 %y3, %x3 +; CHECK-NEXT: [[OR2:%.*]] = or i64 [[OR1]], [[XOR3]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR2]], 0 +; CHECK-NEXT: ret i1 [[CMP]] +; + %xor = xor i64 %y1, %x1 + %xor1 = xor i64 %y2, %x2 + %or = or i64 %xor1, %xor + %xor2 = xor i64 %y3, %x3 + %or1 = or i64 %or, %xor2 + %cmp = icmp eq i64 %or1, 0 + ret i1 %cmp +} + +define i1 @icmp_or_xor_3_2(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { +; CHECK-LABEL: @icmp_or_xor_3_2( +; CHECK-NEXT: [[XOR1:%.*]] = xor i64 %y1, %x1 +; CHECK-NEXT: [[XOR2:%.*]] = xor i64 %y2, %x2 +; CHECK-NEXT: [[OR1:%.*]] = or i64 [[XOR2]], [[XOR1]] +; CHECK-NEXT: [[XOR3:%.*]] = xor i64 %y3, %x3 +; CHECK-NEXT: [[OR2:%.*]] = or i64 [[XOR3]], [[OR1]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR2]], 0 +; CHECK-NEXT: ret i1 [[CMP]] +; + %xor = xor i64 %y1, %x1 + %xor1 = xor i64 %y2, %x2 + %or = or i64 %xor1, %xor + %xor2 = xor i64 %y3, %x3 + %or1 = or i64 %xor2, %or + %cmp = icmp eq i64 %or1, 0 + ret i1 %cmp +} + +define i1 @icmp_or_xor_4(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3, i64 %x4, i64 %y4) { +; CHECK-LABEL: @icmp_or_xor_4( +; CHECK-NEXT: [[XOR1:%.*]] = xor i64 %y1, %x1 +; CHECK-NEXT: [[XOR2:%.*]] = xor i64 %y2, %x2 +; CHECK-NEXT: [[OR1:%.*]] = or i64 [[XOR2]], [[XOR1]] +; CHECK-NEXT: [[XOR3:%.*]] = xor i64 %y3, %x3 +; CHECK-NEXT: [[XOR4:%.*]] = xor i64 %y4, %x4 +; CHECK-NEXT: [[OR2:%.*]] = or i64 [[XOR4]], [[XOR3]] +; CHECK-NEXT: [[OR3:%.*]] = or i64 [[OR1]], [[OR2]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR3]], 0 +; CHECK-NEXT: ret i1 [[CMP]] +; + %xor = xor i64 %y1, %x1 + %xor1 = xor i64 %y2, %x2 + %or = or i64 %xor1, %xor + %xor2 = xor i64 %y3, %x3 + %xor3 = xor i64 %y4, %x4 + %or1 = or i64 %xor3, %xor2 + %or2 = or i64 %or, %or1 + %cmp = icmp eq i64 %or2, 0 + ret i1 %cmp +}