brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · c3f1aed Raw
129 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare void @use.i3(i1)5declare void @use.i5(i5)6declare void @use.i32(i5)7 8define i1 @or_xor_xor_normal_variant1(i1 %a, i1 %b) {9; CHECK-LABEL: @or_xor_xor_normal_variant1(10; CHECK-NEXT:    [[OR:%.*]] = xor i1 [[A:%.*]], [[B:%.*]]11; CHECK-NEXT:    ret i1 [[OR]]12;13  %and = and i1 %a, %b14  %xor1 = xor i1 %and, %a15  %xor2 = xor i1 %and, %b16  %or = or i1 %xor1, %xor217  ret i1 %or18}19 20define i8 @or_xor_xor_normal_variant2(i8 %a, i8 %b) {21; CHECK-LABEL: @or_xor_xor_normal_variant2(22; CHECK-NEXT:    [[OR:%.*]] = xor i8 [[A:%.*]], [[B:%.*]]23; CHECK-NEXT:    ret i8 [[OR]]24;25  %and = and i8 %a, %b26  %xor1 = xor i8 %and, %b27  %xor2 = xor i8 %a, %and28  %or = or i8 %xor1, %xor229  ret i8 %or30}31 32define i16 @or_xor_xor_normal_variant3(i16 %a, i16 %b) {33; CHECK-LABEL: @or_xor_xor_normal_variant3(34; CHECK-NEXT:    [[OR:%.*]] = xor i16 [[B:%.*]], [[A:%.*]]35; CHECK-NEXT:    ret i16 [[OR]]36;37  %and = and i16 %b, %a38  %xor1 = xor i16 %b, %and39  %xor2 = xor i16 %a, %and40  %or = or i16 %xor1, %xor241  ret i16 %or42}43 44define i64 @or_xor_xor_normal_variant4(i64 %a, i64 %b) {45; CHECK-LABEL: @or_xor_xor_normal_variant4(46; CHECK-NEXT:    [[OR:%.*]] = xor i64 [[B:%.*]], [[A:%.*]]47; CHECK-NEXT:    ret i64 [[OR]]48;49  %and = and i64 %b, %a50  %xor1 = xor i64 %and, %b51  %xor2 = xor i64 %and, %a52  %or = or i64 %xor1, %xor253  ret i64 %or54}55 56define i32 @or_xor_xor_normal_binops(i32 %aa, i32 %bb, i32 %cc) {57; CHECK-LABEL: @or_xor_xor_normal_binops(58; CHECK-NEXT:    [[OR:%.*]] = xor i32 [[BB:%.*]], [[AA:%.*]]59; CHECK-NEXT:    ret i32 [[OR]]60;61  %a = xor i32 %aa, %cc62  %b = xor i32 %bb, %cc63 64  %and = and i32 %b, %a65  %xor1 = xor i32 %b, %and66  %xor2 = xor i32 %a, %and67  %or = or i32 %xor1, %xor268  ret i32 %or69}70 71define <3 x i1> @or_xor_xor_normal_vector(<3 x i1> %a, <3 x i1> %b) {72; CHECK-LABEL: @or_xor_xor_normal_vector(73; CHECK-NEXT:    [[OR:%.*]] = xor <3 x i1> [[A:%.*]], [[B:%.*]]74; CHECK-NEXT:    ret <3 x i1> [[OR]]75;76  %and = and <3 x i1> %a, %b77  %xor1 = xor <3 x i1> %and, %b78  %xor2 = xor <3 x i1> %and, %a79  %or = or <3 x i1> %xor1, %xor280  ret <3 x i1> %or81}82 83define i3 @or_xor_xor_normal_multiple_uses_and(i3 %a, i3 %b) {84; CHECK-LABEL: @or_xor_xor_normal_multiple_uses_and(85; CHECK-NEXT:    [[AND:%.*]] = and i3 [[A:%.*]], [[B:%.*]]86; CHECK-NEXT:    call void @use.i3(i3 [[AND]])87; CHECK-NEXT:    [[OR:%.*]] = xor i3 [[A]], [[B]]88; CHECK-NEXT:    ret i3 [[OR]]89;90  %and = and i3 %a, %b91  call void @use.i3(i3 %and)92  %xor1 = xor i3 %b, %and93  %xor2 = xor i3 %a, %and94  %or = or i3 %xor1, %xor295  ret i3 %or96}97 98define i32 @or_xor_xor_negative_multiple_uses_xor1(i32 %a, i32 %b) {99; CHECK-LABEL: @or_xor_xor_negative_multiple_uses_xor1(100; CHECK-NEXT:    [[AND1:%.*]] = xor i32 [[A:%.*]], -1101; CHECK-NEXT:    [[XOR1:%.*]] = and i32 [[B:%.*]], [[AND1]]102; CHECK-NEXT:    call void @use.i32(i32 [[XOR1]])103; CHECK-NEXT:    [[OR:%.*]] = xor i32 [[A]], [[B]]104; CHECK-NEXT:    ret i32 [[OR]]105;106  %and = and i32 %a, %b107  %xor1 = xor i32 %and, %b108  call void @use.i32(i32 %xor1)109  %xor2 = xor i32 %and, %a110  %or = or i32 %xor1, %xor2111  ret i32 %or112}113 114define i5 @or_xor_xor_negative_multiple_uses_xor2(i5 %a, i5 %b) {115; CHECK-LABEL: @or_xor_xor_negative_multiple_uses_xor2(116; CHECK-NEXT:    [[A1:%.*]] = xor i5 [[B:%.*]], -1117; CHECK-NEXT:    [[XOR2:%.*]] = and i5 [[A:%.*]], [[A1]]118; CHECK-NEXT:    call void @use.i5(i5 [[XOR2]])119; CHECK-NEXT:    [[OR:%.*]] = xor i5 [[A]], [[B]]120; CHECK-NEXT:    ret i5 [[OR]]121;122  %and = and i5 %a, %b123  %xor1 = xor i5 %and, %b124  %xor2 = xor i5 %and, %a125  call void @use.i5(i5 %xor2)126  %or = or i5 %xor1, %xor2127  ret i5 %or128}129