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