brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.6 KiB · 1f074c8 Raw
460 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=X644 5; These tests just check that the plumbing is in place for @llvm.bswap. The6; actual output is massive at the moment as llvm.bswap is not yet legal.7 8declare i16 @llvm.bswap.i16(i16) readnone9declare i32 @llvm.bswap.i32(i32) readnone10declare i64 @llvm.bswap.i64(i64) readnone11declare i32 @llvm.bswap.v4i32(i32) readnone12 13; fold (bswap undef) -> undef14define i32 @test_undef() nounwind {15; X86-LABEL: test_undef:16; X86:       # %bb.0:17; X86-NEXT:    retl18;19; X64-LABEL: test_undef:20; X64:       # %bb.0:21; X64-NEXT:    retq22  %b = call i32 @llvm.bswap.i32(i32 undef)23  ret i32 %b24}25 26; fold (bswap (bswap x)) -> x27define i32 @test_bswap_bswap(i32 %a0) nounwind {28; X86-LABEL: test_bswap_bswap:29; X86:       # %bb.0:30; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax31; X86-NEXT:    retl32;33; X64-LABEL: test_bswap_bswap:34; X64:       # %bb.0:35; X64-NEXT:    movl %edi, %eax36; X64-NEXT:    retq37  %b = call i32 @llvm.bswap.i32(i32 %a0)38  %c = call i32 @llvm.bswap.i32(i32 %b)39  ret i32 %c40}41 42define i16 @test_bswap_srli_8_bswap_i16(i16 %a) nounwind {43; X86-LABEL: test_bswap_srli_8_bswap_i16:44; X86:       # %bb.0:45; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax46; X86-NEXT:    shll $8, %eax47; X86-NEXT:    # kill: def $ax killed $ax killed $eax48; X86-NEXT:    retl49;50; X64-LABEL: test_bswap_srli_8_bswap_i16:51; X64:       # %bb.0:52; X64-NEXT:    movl %edi, %eax53; X64-NEXT:    shll $8, %eax54; X64-NEXT:    # kill: def $ax killed $ax killed $eax55; X64-NEXT:    retq56    %1 = call i16 @llvm.bswap.i16(i16 %a)57    %2 = lshr i16 %1, 858    %3 = call i16 @llvm.bswap.i16(i16 %2)59    ret i16 %360}61 62define i32 @test_bswap_srli_8_bswap_i32(i32 %a) nounwind {63; X86-LABEL: test_bswap_srli_8_bswap_i32:64; X86:       # %bb.0:65; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax66; X86-NEXT:    shll $8, %eax67; X86-NEXT:    retl68;69; X64-LABEL: test_bswap_srli_8_bswap_i32:70; X64:       # %bb.0:71; X64-NEXT:    movl %edi, %eax72; X64-NEXT:    shll $8, %eax73; X64-NEXT:    retq74    %1 = call i32 @llvm.bswap.i32(i32 %a)75    %2 = lshr i32 %1, 876    %3 = call i32 @llvm.bswap.i32(i32 %2)77    ret i32 %378}79 80define i64 @test_bswap_srli_16_bswap_i64(i64 %a) nounwind {81; X86-LABEL: test_bswap_srli_16_bswap_i64:82; X86:       # %bb.0:83; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax84; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx85; X86-NEXT:    shll $16, %eax86; X86-NEXT:    retl87;88; X64-LABEL: test_bswap_srli_16_bswap_i64:89; X64:       # %bb.0:90; X64-NEXT:    movq %rdi, %rax91; X64-NEXT:    shlq $16, %rax92; X64-NEXT:    retq93    %1 = call i64 @llvm.bswap.i64(i64 %a)94    %2 = lshr i64 %1, 1695    %3 = call i64 @llvm.bswap.i64(i64 %2)96    ret i64 %397}98 99define i16 @test_bswap_shli_8_bswap_i16(i16 %a) nounwind {100; X86-LABEL: test_bswap_shli_8_bswap_i16:101; X86:       # %bb.0:102; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax103; X86-NEXT:    # kill: def $ax killed $ax killed $eax104; X86-NEXT:    retl105;106; X64-LABEL: test_bswap_shli_8_bswap_i16:107; X64:       # %bb.0:108; X64-NEXT:    movl %edi, %eax109; X64-NEXT:    movzbl %ah, %eax110; X64-NEXT:    # kill: def $ax killed $ax killed $eax111; X64-NEXT:    retq112    %1 = call i16 @llvm.bswap.i16(i16 %a)113    %2 = shl i16 %1, 8114    %3 = call i16 @llvm.bswap.i16(i16 %2)115    ret i16 %3116}117 118define i32 @test_bswap_shli_8_bswap_i32(i32 %a) nounwind {119; X86-LABEL: test_bswap_shli_8_bswap_i32:120; X86:       # %bb.0:121; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax122; X86-NEXT:    shrl $8, %eax123; X86-NEXT:    retl124;125; X64-LABEL: test_bswap_shli_8_bswap_i32:126; X64:       # %bb.0:127; X64-NEXT:    movl %edi, %eax128; X64-NEXT:    shrl $8, %eax129; X64-NEXT:    retq130    %1 = call i32 @llvm.bswap.i32(i32 %a)131    %2 = shl i32 %1, 8132    %3 = call i32 @llvm.bswap.i32(i32 %2)133    ret i32 %3134}135 136define i64 @test_bswap_shli_16_bswap_i64(i64 %a) nounwind {137; X86-LABEL: test_bswap_shli_16_bswap_i64:138; X86:       # %bb.0:139; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax140; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edx141; X86-NEXT:    retl142;143; X64-LABEL: test_bswap_shli_16_bswap_i64:144; X64:       # %bb.0:145; X64-NEXT:    movq %rdi, %rax146; X64-NEXT:    shrq $16, %rax147; X64-NEXT:    retq148    %1 = call i64 @llvm.bswap.i64(i64 %a)149    %2 = shl i64 %1, 16150    %3 = call i64 @llvm.bswap.i64(i64 %2)151    ret i64 %3152}153 154define i32 @test_demandedbits_bswap(i32 %a0) nounwind {155; X86-LABEL: test_demandedbits_bswap:156; X86:       # %bb.0:157; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax158; X86-NEXT:    bswapl %eax159; X86-NEXT:    andl $-65536, %eax # imm = 0xFFFF0000160; X86-NEXT:    retl161;162; X64-LABEL: test_demandedbits_bswap:163; X64:       # %bb.0:164; X64-NEXT:    movl %edi, %eax165; X64-NEXT:    bswapl %eax166; X64-NEXT:    andl $-65536, %eax # imm = 0xFFFF0000167; X64-NEXT:    retq168  %b = or i32 %a0, 4278190080169  %c = call i32 @llvm.bswap.i32(i32 %b)170  %d = and i32 %c, 4294901760171  ret i32 %d172}173 174define void @demand_one_loaded_byte(ptr %xp, ptr %yp) {175; X86-LABEL: demand_one_loaded_byte:176; X86:       # %bb.0:177; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax178; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx179; X86-NEXT:    movzbl 4(%ecx), %ecx180; X86-NEXT:    movb %cl, (%eax)181; X86-NEXT:    retl182;183; X64-LABEL: demand_one_loaded_byte:184; X64:       # %bb.0:185; X64-NEXT:    movzbl 4(%rdi), %eax186; X64-NEXT:    movb %al, (%rsi)187; X64-NEXT:    retq188  %x = load i64, ptr %xp, align 8189  %x_zzzz7654 = lshr i64 %x, 32190  %x_z7654zzz = shl nuw nsw i64 %x_zzzz7654, 24191  %x_4zzz = trunc i64 %x_z7654zzz to i32192  %y = load i32, ptr %yp, align 4193  %y_321z = and i32 %y, -256194  %x_zzz4 = call i32 @llvm.bswap.i32(i32 %x_4zzz)195  %r = or i32 %x_zzz4, %y_321z196  store i32 %r, ptr %yp, align 4197  ret void198}199 200define i64 @test_bswap64_shift48_zext(i16 %a0) {201; X86-LABEL: test_bswap64_shift48_zext:202; X86:       # %bb.0:203; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax204; X86-NEXT:    rolw $8, %ax205; X86-NEXT:    movzwl %ax, %eax206; X86-NEXT:    xorl %edx, %edx207; X86-NEXT:    retl208;209; X64-LABEL: test_bswap64_shift48_zext:210; X64:       # %bb.0:211; X64-NEXT:    rolw $8, %di212; X64-NEXT:    movzwl %di, %eax213; X64-NEXT:    retq214  %z = zext i16 %a0 to i64215  %s = shl i64 %z, 48216  %b = call i64 @llvm.bswap.i64(i64 %s)217  ret i64 %b218}219 220define i64 @test_bswap64_shift48(i64 %a0) {221; X86-LABEL: test_bswap64_shift48:222; X86:       # %bb.0:223; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax224; X86-NEXT:    rolw $8, %ax225; X86-NEXT:    movzwl %ax, %eax226; X86-NEXT:    xorl %edx, %edx227; X86-NEXT:    retl228;229; X64-LABEL: test_bswap64_shift48:230; X64:       # %bb.0:231; X64-NEXT:    rolw $8, %di232; X64-NEXT:    movzwl %di, %eax233; X64-NEXT:    retq234  %s = shl i64 %a0, 48235  %b = call i64 @llvm.bswap.i64(i64 %s)236  ret i64 %b237}238 239define i32 @test_bswap32_shift17(i32 %a0) {240; X86-LABEL: test_bswap32_shift17:241; X86:       # %bb.0:242; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax243; X86-NEXT:    shll $17, %eax244; X86-NEXT:    bswapl %eax245; X86-NEXT:    retl246;247; X64-LABEL: test_bswap32_shift17:248; X64:       # %bb.0:249; X64-NEXT:    movl %edi, %eax250; X64-NEXT:    shll $17, %eax251; X64-NEXT:    bswapl %eax252; X64-NEXT:    retq253  %s = shl i32 %a0, 17254  %b = call i32 @llvm.bswap.i32(i32 %s)255  ret i32 %b256}257 258define i32 @bs_and_lhs_bs32(i32 %a, i32 %b) #0 {259; X86-LABEL: bs_and_lhs_bs32:260; X86:       # %bb.0:261; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax262; X86-NEXT:    bswapl %eax263; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax264; X86-NEXT:    retl265;266; X64-LABEL: bs_and_lhs_bs32:267; X64:       # %bb.0:268; X64-NEXT:    movl %esi, %eax269; X64-NEXT:    bswapl %eax270; X64-NEXT:    andl %edi, %eax271; X64-NEXT:    retq272  %1 = tail call i32 @llvm.bswap.i32(i32 %a)273  %2 = and i32 %1, %b274  %3 = tail call i32 @llvm.bswap.i32(i32 %2)275  ret i32 %3276}277 278define i64 @bs_or_lhs_bs64(i64 %a, i64 %b) #0 {279; X86-LABEL: bs_or_lhs_bs64:280; X86:       # %bb.0:281; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx282; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax283; X86-NEXT:    bswapl %eax284; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax285; X86-NEXT:    bswapl %edx286; X86-NEXT:    orl {{[0-9]+}}(%esp), %edx287; X86-NEXT:    retl288;289; X64-LABEL: bs_or_lhs_bs64:290; X64:       # %bb.0:291; X64-NEXT:    movq %rsi, %rax292; X64-NEXT:    bswapq %rax293; X64-NEXT:    orq %rdi, %rax294; X64-NEXT:    retq295  %1 = tail call i64 @llvm.bswap.i64(i64 %a)296  %2 = or i64 %1, %b297  %3 = tail call i64 @llvm.bswap.i64(i64 %2)298  ret i64 %3299}300 301define i64 @bs_xor_rhs_bs64(i64 %a, i64 %b) #0 {302; X86-LABEL: bs_xor_rhs_bs64:303; X86:       # %bb.0:304; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx305; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax306; X86-NEXT:    bswapl %eax307; X86-NEXT:    xorl {{[0-9]+}}(%esp), %eax308; X86-NEXT:    bswapl %edx309; X86-NEXT:    xorl {{[0-9]+}}(%esp), %edx310; X86-NEXT:    retl311;312; X64-LABEL: bs_xor_rhs_bs64:313; X64:       # %bb.0:314; X64-NEXT:    movq %rdi, %rax315; X64-NEXT:    bswapq %rax316; X64-NEXT:    xorq %rsi, %rax317; X64-NEXT:    retq318  %1 = tail call i64 @llvm.bswap.i64(i64 %b)319  %2 = xor i64 %a, %1320  %3 = tail call i64 @llvm.bswap.i64(i64 %2)321  ret i64 %3322}323 324define i32 @bs_and_all_operand_multiuse(i32 %a, i32 %b) #0 {325; X86-LABEL: bs_and_all_operand_multiuse:326; X86:       # %bb.0:327; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx328; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax329; X86-NEXT:    movl %eax, %edx330; X86-NEXT:    bswapl %edx331; X86-NEXT:    andl %ecx, %eax332; X86-NEXT:    bswapl %ecx333; X86-NEXT:    imull %edx, %eax334; X86-NEXT:    imull %ecx, %eax335; X86-NEXT:    retl336;337; X64-LABEL: bs_and_all_operand_multiuse:338; X64:       # %bb.0:339; X64-NEXT:    movl %edi, %eax340; X64-NEXT:    bswapl %eax341; X64-NEXT:    andl %esi, %edi342; X64-NEXT:    bswapl %esi343; X64-NEXT:    imull %edi, %eax344; X64-NEXT:    imull %esi, %eax345; X64-NEXT:    retq346  %1 = tail call i32 @llvm.bswap.i32(i32 %a)347  %2 = tail call i32 @llvm.bswap.i32(i32 %b)348  %3 = and i32 %1, %2349  %4 = tail call i32 @llvm.bswap.i32(i32 %3)350  %5 = mul i32 %1, %4 ;increase use of left bswap351  %6 = mul i32 %2, %5 ;increase use of right bswap352 353  ret i32 %6354}355 356; negative test357define i32 @bs_and_rhs_bs32_multiuse1(i32 %a, i32 %b) #0 {358; X86-LABEL: bs_and_rhs_bs32_multiuse1:359; X86:       # %bb.0:360; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx361; X86-NEXT:    bswapl %ecx362; X86-NEXT:    andl {{[0-9]+}}(%esp), %ecx363; X86-NEXT:    movl %ecx, %eax364; X86-NEXT:    bswapl %eax365; X86-NEXT:    imull %ecx, %eax366; X86-NEXT:    retl367;368; X64-LABEL: bs_and_rhs_bs32_multiuse1:369; X64:       # %bb.0:370; X64-NEXT:    bswapl %esi371; X64-NEXT:    andl %edi, %esi372; X64-NEXT:    movl %esi, %eax373; X64-NEXT:    bswapl %eax374; X64-NEXT:    imull %esi, %eax375; X64-NEXT:    retq376  %1 = tail call i32 @llvm.bswap.i32(i32 %b)377  %2 = and i32 %1, %a378  %3 = tail call i32 @llvm.bswap.i32(i32 %2)379  %4 = mul i32 %2, %3 ;increase use of logical op380  ret i32 %4381}382 383; negative test384define i32 @bs_and_rhs_bs32_multiuse2(i32 %a, i32 %b) #0 {385; X86-LABEL: bs_and_rhs_bs32_multiuse2:386; X86:       # %bb.0:387; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx388; X86-NEXT:    bswapl %ecx389; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax390; X86-NEXT:    andl %ecx, %eax391; X86-NEXT:    bswapl %eax392; X86-NEXT:    imull %ecx, %eax393; X86-NEXT:    retl394;395; X64-LABEL: bs_and_rhs_bs32_multiuse2:396; X64:       # %bb.0:397; X64-NEXT:    movl %edi, %eax398; X64-NEXT:    bswapl %esi399; X64-NEXT:    andl %esi, %eax400; X64-NEXT:    bswapl %eax401; X64-NEXT:    imull %esi, %eax402; X64-NEXT:    retq403  %1 = tail call i32 @llvm.bswap.i32(i32 %b)404  %2 = and i32 %1, %a405  %3 = tail call i32 @llvm.bswap.i32(i32 %2)406  %4 = mul i32 %1, %3 ;increase use of inner bswap407  ret i32 %4408}409 410; negative test411define i64 @test_bswap64_shift17(i64 %a0) {412; X86-LABEL: test_bswap64_shift17:413; X86:       # %bb.0:414; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx415; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax416; X86-NEXT:    shldl $17, %edx, %eax417; X86-NEXT:    shll $17, %edx418; X86-NEXT:    bswapl %eax419; X86-NEXT:    bswapl %edx420; X86-NEXT:    retl421;422; X64-LABEL: test_bswap64_shift17:423; X64:       # %bb.0:424; X64-NEXT:    movq %rdi, %rax425; X64-NEXT:    shlq $17, %rax426; X64-NEXT:    bswapq %rax427; X64-NEXT:    retq428  %s = shl i64 %a0, 17429  %b = call i64 @llvm.bswap.i64(i64 %s)430  ret i64 %b431}432 433; negative test434define i64 @test_bswap64_shift48_multiuse(i64 %a0, ptr %a1) {435; X86-LABEL: test_bswap64_shift48_multiuse:436; X86:       # %bb.0:437; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx438; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax439; X86-NEXT:    shll $16, %eax440; X86-NEXT:    movl %eax, 4(%ecx)441; X86-NEXT:    bswapl %eax442; X86-NEXT:    movl %eax, (%ecx)443; X86-NEXT:    xorl %edx, %edx444; X86-NEXT:    retl445;446; X64-LABEL: test_bswap64_shift48_multiuse:447; X64:       # %bb.0:448; X64-NEXT:    shlq $48, %rdi449; X64-NEXT:    movq %rdi, %rax450; X64-NEXT:    bswapq %rax451; X64-NEXT:    orq %rax, %rdi452; X64-NEXT:    movq %rdi, (%rsi)453; X64-NEXT:    retq454  %s = shl i64 %a0, 48455  %b = call i64 @llvm.bswap.i64(i64 %s)456  %a = add i64 %s, %b457  store i64 %a, ptr %a1458  ret i64 %b459}460