82 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; (x&z) ^ (y&z) -> (x^y)&z5define i32 @test1(i32 %x, i32 %y, i32 %z) {6; CHECK-LABEL: @test1(7; CHECK-NEXT: [[T61:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]8; CHECK-NEXT: [[T7:%.*]] = and i32 [[Z:%.*]], [[T61]]9; CHECK-NEXT: ret i32 [[T7]]10;11 %t3 = and i32 %z, %x12 %t6 = and i32 %z, %y13 %t7 = xor i32 %t3, %t614 ret i32 %t715}16 17; (x & y) ^ (x|y) -> x^y18define i32 @test2(i32 %x, i32 %y, i32 %z) {19; CHECK-LABEL: @test2(20; CHECK-NEXT: [[T7:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]21; CHECK-NEXT: ret i32 [[T7]]22;23 %t3 = and i32 %y, %x24 %t6 = or i32 %y, %x25 %t7 = xor i32 %t3, %t626 ret i32 %t727}28 29define i32 @PR38781(i32 %a, i32 %b) {30; CHECK-LABEL: @PR38781(31; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[B:%.*]], [[A:%.*]]32; CHECK-NEXT: [[AND2:%.*]] = icmp sgt i32 [[TMP1]], -133; CHECK-NEXT: [[AND:%.*]] = zext i1 [[AND2]] to i3234; CHECK-NEXT: ret i32 [[AND]]35;36 %a.lobit = lshr i32 %a, 3137 %a.lobit.not = xor i32 %a.lobit, 138 %b.lobit = lshr i32 %b, 3139 %b.lobit.not = xor i32 %b.lobit, 140 %and = and i32 %b.lobit.not, %a.lobit.not41 ret i32 %and42}43 44; (a ^ 4) & (a ^ ~4) -> 045define i32 @PR75692_1(i32 %x) {46; CHECK-LABEL: @PR75692_1(47; CHECK-NEXT: ret i32 048;49 %t2 = xor i32 %x, 450 %t3 = xor i32 %x, -551 %t4 = and i32 %t2, %t352 ret i32 %t453}54 55; (a ^ 4) & (a ^ 3) is not zero56define i32 @PR75692_2(i32 %x) {57; CHECK-LABEL: @PR75692_2(58; CHECK-NEXT: [[T2:%.*]] = xor i32 [[X:%.*]], 459; CHECK-NEXT: [[T3:%.*]] = xor i32 [[X]], -460; CHECK-NEXT: [[T4:%.*]] = and i32 [[T2]], [[T3]]61; CHECK-NEXT: ret i32 [[T4]]62;63 %t2 = xor i32 %x, 464 %t3 = xor i32 %x, -465 %t4 = and i32 %t2, %t366 ret i32 %t467}68 69; (a ^ 4) & (b ^ ~4) is not zero, since a != b is possible70define i32 @PR75692_3(i32 %x, i32 %y) {71; CHECK-LABEL: @PR75692_3(72; CHECK-NEXT: [[T2:%.*]] = xor i32 [[X:%.*]], 473; CHECK-NEXT: [[T3:%.*]] = xor i32 [[Y:%.*]], -574; CHECK-NEXT: [[T4:%.*]] = and i32 [[T2]], [[T3]]75; CHECK-NEXT: ret i32 [[T4]]76;77 %t2 = xor i32 %x, 478 %t3 = xor i32 %y, -579 %t4 = and i32 %t2, %t380 ret i32 %t481}82