brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.9 KiB · 08a6e38 Raw
278 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s3 4; https://bugs.llvm.org/show_bug.cgi?id=371045 6; X:       [bit2]      [bit0]7; Y: [bit3]      [bit1]8 9define i8 @out8_constmask(i8 %x, i8 %y) {10; CHECK-LABEL: out8_constmask:11; CHECK:       // %bb.0:12; CHECK-NEXT:    mov w8, #85 // =0x5513; CHECK-NEXT:    mov w9, #-86 // =0xffffffaa14; CHECK-NEXT:    and w8, w0, w815; CHECK-NEXT:    and w9, w1, w916; CHECK-NEXT:    orr w0, w8, w917; CHECK-NEXT:    ret18  %mx = and i8 %x, 8519  %my = and i8 %y, -8620  %r = or i8 %mx, %my21  ret i8 %r22}23 24define i16 @out16_constmask(i16 %x, i16 %y) {25; CHECK-LABEL: out16_constmask:26; CHECK:       // %bb.0:27; CHECK-NEXT:    mov w8, #21845 // =0x555528; CHECK-NEXT:    mov w9, #-21846 // =0xffffaaaa29; CHECK-NEXT:    and w8, w0, w830; CHECK-NEXT:    and w9, w1, w931; CHECK-NEXT:    orr w0, w8, w932; CHECK-NEXT:    ret33  %mx = and i16 %x, 2184534  %my = and i16 %y, -2184635  %r = or i16 %mx, %my36  ret i16 %r37}38 39define i32 @out32_constmask(i32 %x, i32 %y) {40; CHECK-LABEL: out32_constmask:41; CHECK:       // %bb.0:42; CHECK-NEXT:    and w8, w0, #0x5555555543; CHECK-NEXT:    and w9, w1, #0xaaaaaaaa44; CHECK-NEXT:    orr w0, w8, w945; CHECK-NEXT:    ret46  %mx = and i32 %x, 143165576547  %my = and i32 %y, -143165576648  %r = or i32 %mx, %my49  ret i32 %r50}51 52define i64 @out64_constmask(i64 %x, i64 %y) {53; CHECK-LABEL: out64_constmask:54; CHECK:       // %bb.0:55; CHECK-NEXT:    and x8, x0, #0x555555555555555556; CHECK-NEXT:    and x9, x1, #0xaaaaaaaaaaaaaaaa57; CHECK-NEXT:    orr x0, x8, x958; CHECK-NEXT:    ret59  %mx = and i64 %x, 614891469123651720560  %my = and i64 %y, -614891469123651720661  %r = or i64 %mx, %my62  ret i64 %r63}64 65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66; Should be the same as the previous one.67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68 69define i8 @in8_constmask(i8 %x, i8 %y) {70; CHECK-LABEL: in8_constmask:71; CHECK:       // %bb.0:72; CHECK-NEXT:    mov w8, #85 // =0x5573; CHECK-NEXT:    eor w9, w0, w174; CHECK-NEXT:    and w8, w9, w875; CHECK-NEXT:    eor w0, w8, w176; CHECK-NEXT:    ret77  %n0 = xor i8 %x, %y78  %n1 = and i8 %n0, 8579  %r = xor i8 %n1, %y80  ret i8 %r81}82 83define i16 @in16_constmask(i16 %x, i16 %y) {84; CHECK-LABEL: in16_constmask:85; CHECK:       // %bb.0:86; CHECK-NEXT:    mov w8, #21845 // =0x555587; CHECK-NEXT:    eor w9, w0, w188; CHECK-NEXT:    and w8, w9, w889; CHECK-NEXT:    eor w0, w8, w190; CHECK-NEXT:    ret91  %n0 = xor i16 %x, %y92  %n1 = and i16 %n0, 2184593  %r = xor i16 %n1, %y94  ret i16 %r95}96 97define i32 @in32_constmask(i32 %x, i32 %y) {98; CHECK-LABEL: in32_constmask:99; CHECK:       // %bb.0:100; CHECK-NEXT:    eor w8, w0, w1101; CHECK-NEXT:    and w8, w8, #0x55555555102; CHECK-NEXT:    eor w0, w8, w1103; CHECK-NEXT:    ret104  %n0 = xor i32 %x, %y105  %n1 = and i32 %n0, 1431655765106  %r = xor i32 %n1, %y107  ret i32 %r108}109 110define i64 @in64_constmask(i64 %x, i64 %y) {111; CHECK-LABEL: in64_constmask:112; CHECK:       // %bb.0:113; CHECK-NEXT:    eor x8, x0, x1114; CHECK-NEXT:    and x8, x8, #0x5555555555555555115; CHECK-NEXT:    eor x0, x8, x1116; CHECK-NEXT:    ret117  %n0 = xor i64 %x, %y118  %n1 = and i64 %n0, 6148914691236517205119  %r = xor i64 %n1, %y120  ret i64 %r121}122 123; ============================================================================ ;124; Constant Commutativity tests.125; ============================================================================ ;126 127define i32 @in_constmask_commutativity_0_1(i32 %x, i32 %y) {128; CHECK-LABEL: in_constmask_commutativity_0_1:129; CHECK:       // %bb.0:130; CHECK-NEXT:    eor w8, w0, w1131; CHECK-NEXT:    and w8, w8, #0x55555555132; CHECK-NEXT:    eor w0, w1, w8133; CHECK-NEXT:    ret134  %n0 = xor i32 %x, %y135  %n1 = and i32 %n0, 1431655765136  %r = xor i32 %y, %n1 ; swapped137  ret i32 %r138}139 140define i32 @in_constmask_commutativity_1_0(i32 %x, i32 %y) {141; CHECK-LABEL: in_constmask_commutativity_1_0:142; CHECK:       // %bb.0:143; CHECK-NEXT:    eor w8, w0, w1144; CHECK-NEXT:    and w8, w8, #0x55555555145; CHECK-NEXT:    eor w0, w8, w0146; CHECK-NEXT:    ret147  %n0 = xor i32 %x, %y148  %n1 = and i32 %n0, 1431655765149  %r = xor i32 %n1, %x ; %x instead of %y150  ret i32 %r151}152 153define i32 @in_constmask_commutativity_1_1(i32 %x, i32 %y) {154; CHECK-LABEL: in_constmask_commutativity_1_1:155; CHECK:       // %bb.0:156; CHECK-NEXT:    eor w8, w0, w1157; CHECK-NEXT:    and w8, w8, #0x55555555158; CHECK-NEXT:    eor w0, w0, w8159; CHECK-NEXT:    ret160  %n0 = xor i32 %x, %y161  %n1 = and i32 %n0, 1431655765162  %r = xor i32 %x, %n1 ; swapped, %x instead of %y163  ret i32 %r164}165 166; ============================================================================ ;167; Y is an 'and' too.168; ============================================================================ ;169 170define i32 @in_complex_y0_constmask(i32 %x, i32 %y_hi, i32 %y_low) {171; CHECK-LABEL: in_complex_y0_constmask:172; CHECK:       // %bb.0:173; CHECK-NEXT:    and w8, w1, w2174; CHECK-NEXT:    eor w9, w0, w8175; CHECK-NEXT:    and w9, w9, #0x55555555176; CHECK-NEXT:    eor w0, w9, w8177; CHECK-NEXT:    ret178  %y = and i32 %y_hi, %y_low179  %n0 = xor i32 %x, %y180  %n1 = and i32 %n0, 1431655765181  %r = xor i32 %n1, %y182  ret i32 %r183}184 185define i32 @in_complex_y1_constmask(i32 %x, i32 %y_hi, i32 %y_low) {186; CHECK-LABEL: in_complex_y1_constmask:187; CHECK:       // %bb.0:188; CHECK-NEXT:    and w8, w1, w2189; CHECK-NEXT:    eor w9, w0, w8190; CHECK-NEXT:    and w9, w9, #0x55555555191; CHECK-NEXT:    eor w0, w8, w9192; CHECK-NEXT:    ret193  %y = and i32 %y_hi, %y_low194  %n0 = xor i32 %x, %y195  %n1 = and i32 %n0, 1431655765196  %r = xor i32 %y, %n1197  ret i32 %r198}199 200; ============================================================================ ;201; Negative tests. Should not be folded.202; ============================================================================ ;203 204; Multi-use tests.205 206declare void @use32(i32) nounwind207 208define i32 @in_multiuse_A_constmask(i32 %x, i32 %y, i32 %z) nounwind {209; CHECK-LABEL: in_multiuse_A_constmask:210; CHECK:       // %bb.0:211; CHECK-NEXT:    str x30, [sp, #-32]! // 8-byte Folded Spill212; CHECK-NEXT:    eor w8, w0, w1213; CHECK-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill214; CHECK-NEXT:    mov w19, w1215; CHECK-NEXT:    and w20, w8, #0x55555555216; CHECK-NEXT:    mov w0, w20217; CHECK-NEXT:    bl use32218; CHECK-NEXT:    eor w0, w20, w19219; CHECK-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload220; CHECK-NEXT:    ldr x30, [sp], #32 // 8-byte Folded Reload221; CHECK-NEXT:    ret222  %n0 = xor i32 %x, %y223  %n1 = and i32 %n0, 1431655765224  call void @use32(i32 %n1)225  %r = xor i32 %n1, %y226  ret i32 %r227}228 229define i32 @in_multiuse_B_constmask(i32 %x, i32 %y, i32 %z) nounwind {230; CHECK-LABEL: in_multiuse_B_constmask:231; CHECK:       // %bb.0:232; CHECK-NEXT:    str x30, [sp, #-32]! // 8-byte Folded Spill233; CHECK-NEXT:    eor w0, w0, w1234; CHECK-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill235; CHECK-NEXT:    mov w19, w1236; CHECK-NEXT:    and w20, w0, #0x55555555237; CHECK-NEXT:    bl use32238; CHECK-NEXT:    eor w0, w20, w19239; CHECK-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload240; CHECK-NEXT:    ldr x30, [sp], #32 // 8-byte Folded Reload241; CHECK-NEXT:    ret242  %n0 = xor i32 %x, %y243  %n1 = and i32 %n0, 1431655765244  call void @use32(i32 %n0)245  %r = xor i32 %n1, %y246  ret i32 %r247}248 249; Various bad variants250 251define i32 @n0_badconstmask(i32 %x, i32 %y) {252; CHECK-LABEL: n0_badconstmask:253; CHECK:       // %bb.0:254; CHECK-NEXT:    mov w8, #43691 // =0xaaab255; CHECK-NEXT:    and w9, w0, #0x55555555256; CHECK-NEXT:    movk w8, #43690, lsl #16257; CHECK-NEXT:    and w8, w1, w8258; CHECK-NEXT:    orr w0, w9, w8259; CHECK-NEXT:    ret260  %mx = and i32 %x, 1431655765261  %my = and i32 %y, -1431655765 ; instead of -1431655766262  %r = or i32 %mx, %my263  ret i32 %r264}265 266define i32 @n1_thirdvar_constmask(i32 %x, i32 %y, i32 %z) {267; CHECK-LABEL: n1_thirdvar_constmask:268; CHECK:       // %bb.0:269; CHECK-NEXT:    eor w8, w0, w1270; CHECK-NEXT:    and w8, w8, #0x55555555271; CHECK-NEXT:    eor w0, w8, w2272; CHECK-NEXT:    ret273  %n0 = xor i32 %x, %y274  %n1 = and i32 %n0, 1431655765275  %r = xor i32 %n1, %z ; instead of %y276  ret i32 %r277}278