636 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefixes=X644; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+tbm | FileCheck %s --check-prefixes=X645 6; PR35908 - Fold ADD/SUB and bit extracts into ADC/SBB+BT7;8; int test_add_add(int x, int y, int z) { return ((x + y) + bool(z & (1 << 30))); }9; int test_add_sub(int x, int y, int z) { return ((x - y) + bool(z & (1 << 30))); }10; int test_sub_add(int x, int y, int z) { return ((x + y) - bool(z & (1 << 30))); }11; int test_sub_sub(int x, int y, int z) { return (x - (y - bool(z & (1 << 30)))); }12 13;14; Constant Bit Indices15;16 17define i32 @test_i32_add_add_idx(i32 %x, i32 %y, i32 %z) nounwind {18; X86-LABEL: test_i32_add_add_idx:19; X86: # %bb.0:20; X86-NEXT: movl {{[0-9]+}}(%esp), %eax21; X86-NEXT: btl $30, {{[0-9]+}}(%esp)22; X86-NEXT: adcl {{[0-9]+}}(%esp), %eax23; X86-NEXT: retl24;25; X64-LABEL: test_i32_add_add_idx:26; X64: # %bb.0:27; X64-NEXT: movl %edi, %eax28; X64-NEXT: btl $30, %edx29; X64-NEXT: adcl %esi, %eax30; X64-NEXT: retq31 %add = add i32 %y, %x32 %shift = lshr i32 %z, 3033 %mask = and i32 %shift, 134 %add1 = add i32 %add, %mask35 ret i32 %add136}37 38define i32 @test_i32_add_add_commute_idx(i32 %x, i32 %y, i32 %z) nounwind {39; X86-LABEL: test_i32_add_add_commute_idx:40; X86: # %bb.0:41; X86-NEXT: movl {{[0-9]+}}(%esp), %eax42; X86-NEXT: btl $2, {{[0-9]+}}(%esp)43; X86-NEXT: adcl {{[0-9]+}}(%esp), %eax44; X86-NEXT: retl45;46; X64-LABEL: test_i32_add_add_commute_idx:47; X64: # %bb.0:48; X64-NEXT: movl %edi, %eax49; X64-NEXT: btl $2, %edx50; X64-NEXT: adcl %esi, %eax51; X64-NEXT: retq52 %add = add i32 %y, %x53 %shift = lshr i32 %z, 254 %mask = and i32 %shift, 155 %add1 = add i32 %mask, %add56 ret i32 %add157}58 59define i32 @test_i32_add_add_idx0(i32 %x, i32 %y, i32 %z) nounwind {60; X86-LABEL: test_i32_add_add_idx0:61; X86: # %bb.0:62; X86-NEXT: movl {{[0-9]+}}(%esp), %eax63; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx64; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx65; X86-NEXT: andl $1, %eax66; X86-NEXT: addl %ecx, %eax67; X86-NEXT: retl68;69; X64-LABEL: test_i32_add_add_idx0:70; X64: # %bb.0:71; X64-NEXT: # kill: def $esi killed $esi def $rsi72; X64-NEXT: # kill: def $edi killed $edi def $rdi73; X64-NEXT: leal (%rdi,%rsi), %eax74; X64-NEXT: andl $1, %edx75; X64-NEXT: addl %edx, %eax76; X64-NEXT: retq77 %add = add i32 %y, %x78 %mask = and i32 %z, 179 %add1 = add i32 %mask, %add80 ret i32 %add181}82 83define i24 @test_i24_add_add_idx(i24 %x, i24 %y, i24 %z) nounwind {84; X86-LABEL: test_i24_add_add_idx:85; X86: # %bb.0:86; X86-NEXT: movl {{[0-9]+}}(%esp), %eax87; X86-NEXT: btl $15, {{[0-9]+}}(%esp)88; X86-NEXT: adcl {{[0-9]+}}(%esp), %eax89; X86-NEXT: retl90;91; X64-LABEL: test_i24_add_add_idx:92; X64: # %bb.0:93; X64-NEXT: movl %edi, %eax94; X64-NEXT: btl $15, %edx95; X64-NEXT: adcl %esi, %eax96; X64-NEXT: retq97 %add = add i24 %y, %x98 %shift = lshr i24 %z, 1599 %mask = and i24 %shift, 1100 %add1 = add i24 %add, %mask101 ret i24 %add1102}103 104define i128 @test_i128_add_add_idx(i128 %x, i128 %y, i128 %z) nounwind {105; X86-LABEL: test_i128_add_add_idx:106; X86: # %bb.0:107; X86-NEXT: pushl %ebp108; X86-NEXT: movl %esp, %ebp109; X86-NEXT: pushl %edi110; X86-NEXT: pushl %esi111; X86-NEXT: andl $-16, %esp112; X86-NEXT: movl 8(%ebp), %eax113; X86-NEXT: movl 48(%ebp), %ecx114; X86-NEXT: movl 52(%ebp), %edx115; X86-NEXT: movl 40(%ebp), %esi116; X86-NEXT: movl 44(%ebp), %edi117; X86-NEXT: addl 24(%ebp), %esi118; X86-NEXT: adcl 28(%ebp), %edi119; X86-NEXT: adcl 32(%ebp), %ecx120; X86-NEXT: adcl 36(%ebp), %edx121; X86-NEXT: btl $5, 64(%ebp)122; X86-NEXT: adcl $0, %esi123; X86-NEXT: adcl $0, %edi124; X86-NEXT: adcl $0, %ecx125; X86-NEXT: adcl $0, %edx126; X86-NEXT: movl %edi, 4(%eax)127; X86-NEXT: movl %esi, (%eax)128; X86-NEXT: movl %ecx, 8(%eax)129; X86-NEXT: movl %edx, 12(%eax)130; X86-NEXT: leal -8(%ebp), %esp131; X86-NEXT: popl %esi132; X86-NEXT: popl %edi133; X86-NEXT: popl %ebp134; X86-NEXT: retl $4135;136; X64-LABEL: test_i128_add_add_idx:137; X64: # %bb.0:138; X64-NEXT: movq %rdi, %rax139; X64-NEXT: addq %rdx, %rax140; X64-NEXT: adcq %rcx, %rsi141; X64-NEXT: btl $5, %r9d142; X64-NEXT: adcq $0, %rax143; X64-NEXT: adcq $0, %rsi144; X64-NEXT: movq %rsi, %rdx145; X64-NEXT: retq146 %add = add i128 %y, %x147 %shift = lshr i128 %z, 69148 %mask = and i128 %shift, 1149 %add1 = add i128 %add, %mask150 ret i128 %add1151}152 153define i32 @test_i32_add_sub_idx(i32 %x, i32 %y, i32 %z) nounwind {154; X86-LABEL: test_i32_add_sub_idx:155; X86: # %bb.0:156; X86-NEXT: movl {{[0-9]+}}(%esp), %eax157; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx158; X86-NEXT: subl {{[0-9]+}}(%esp), %ecx159; X86-NEXT: shrl $31, %eax160; X86-NEXT: addl %ecx, %eax161; X86-NEXT: retl162;163; X64-LABEL: test_i32_add_sub_idx:164; X64: # %bb.0:165; X64-NEXT: # kill: def $edx killed $edx def $rdx166; X64-NEXT: # kill: def $edi killed $edi def $rdi167; X64-NEXT: subl %esi, %edi168; X64-NEXT: shrl $31, %edx169; X64-NEXT: leal (%rdx,%rdi), %eax170; X64-NEXT: retq171 %sub = sub i32 %x, %y172 %shift = lshr i32 %z, 31173 %mask = and i32 %shift, 1174 %add = add i32 %sub, %mask175 ret i32 %add176}177 178define i32 @test_i32_add_sub_commute_idx(i32 %x, i32 %y, i32 %z) nounwind {179; X86-LABEL: test_i32_add_sub_commute_idx:180; X86: # %bb.0:181; X86-NEXT: movl {{[0-9]+}}(%esp), %eax182; X86-NEXT: subl {{[0-9]+}}(%esp), %eax183; X86-NEXT: btl $8, {{[0-9]+}}(%esp)184; X86-NEXT: adcl $0, %eax185; X86-NEXT: retl186;187; X64-LABEL: test_i32_add_sub_commute_idx:188; X64: # %bb.0:189; X64-NEXT: movl %edi, %eax190; X64-NEXT: subl %esi, %eax191; X64-NEXT: btl $8, %edx192; X64-NEXT: adcl $0, %eax193; X64-NEXT: retq194 %sub = sub i32 %x, %y195 %shift = lshr i32 %z, 8196 %mask = and i32 %shift, 1197 %add = add i32 %mask, %sub198 ret i32 %add199}200 201define i32 @test_i32_sub_add_idx(i32 %x, i32 %y, i32 %z) nounwind {202; X86-LABEL: test_i32_sub_add_idx:203; X86: # %bb.0:204; X86-NEXT: movl {{[0-9]+}}(%esp), %eax205; X86-NEXT: addl {{[0-9]+}}(%esp), %eax206; X86-NEXT: btl $1, {{[0-9]+}}(%esp)207; X86-NEXT: sbbl $0, %eax208; X86-NEXT: retl209;210; X64-LABEL: test_i32_sub_add_idx:211; X64: # %bb.0:212; X64-NEXT: # kill: def $esi killed $esi def $rsi213; X64-NEXT: # kill: def $edi killed $edi def $rdi214; X64-NEXT: leal (%rdi,%rsi), %eax215; X64-NEXT: btl $1, %edx216; X64-NEXT: sbbl $0, %eax217; X64-NEXT: retq218 %add = add i32 %y, %x219 %shift = lshr i32 %z, 1220 %mask = and i32 %shift, 1221 %sub = sub i32 %add, %mask222 ret i32 %sub223}224 225define i32 @test_i32_sub_add_commute_idx(i32 %x, i32 %y, i32 %z) nounwind {226; X86-LABEL: test_i32_sub_add_commute_idx:227; X86: # %bb.0:228; X86-NEXT: movl {{[0-9]+}}(%esp), %eax229; X86-NEXT: btl $1, {{[0-9]+}}(%esp)230; X86-NEXT: sbbl {{[0-9]+}}(%esp), %eax231; X86-NEXT: retl232;233; X64-LABEL: test_i32_sub_add_commute_idx:234; X64: # %bb.0:235; X64-NEXT: movl %edi, %eax236; X64-NEXT: btl $1, %edx237; X64-NEXT: sbbl %esi, %eax238; X64-NEXT: retq239 %shift = lshr i32 %z, 1240 %mask = and i32 %shift, 1241 %add = add i32 %y, %mask242 %sub = sub i32 %x, %add243 ret i32 %sub244}245 246define i32 @test_i32_sub_add_sext_idx(i32 %x, i32 %y, i32 %z) nounwind {247; X86-LABEL: test_i32_sub_add_sext_idx:248; X86: # %bb.0:249; X86-NEXT: movl {{[0-9]+}}(%esp), %eax250; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx251; X86-NEXT: shll $25, %ecx252; X86-NEXT: sarl $31, %ecx253; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx254; X86-NEXT: subl %ecx, %eax255; X86-NEXT: retl256;257; X64-LABEL: test_i32_sub_add_sext_idx:258; X64: # %bb.0:259; X64-NEXT: movl %edi, %eax260; X64-NEXT: shll $25, %edx261; X64-NEXT: sarl $31, %edx262; X64-NEXT: addl %esi, %edx263; X64-NEXT: subl %edx, %eax264; X64-NEXT: retq265 %shl = shl i32 %z, 25266 %sext = ashr i32 %shl, 31267 %add = add i32 %y, %sext268 %sub = sub i32 %x, %add269 ret i32 %sub270}271 272define i32 @test_i32_sub_sub_idx(i32 %x, i32 %y, i32 %z) nounwind {273; X86-LABEL: test_i32_sub_sub_idx:274; X86: # %bb.0:275; X86-NEXT: movl {{[0-9]+}}(%esp), %eax276; X86-NEXT: btl $16, {{[0-9]+}}(%esp)277; X86-NEXT: adcl $0, %eax278; X86-NEXT: subl {{[0-9]+}}(%esp), %eax279; X86-NEXT: retl280;281; X64-LABEL: test_i32_sub_sub_idx:282; X64: # %bb.0:283; X64-NEXT: movl %edi, %eax284; X64-NEXT: btl $16, %edx285; X64-NEXT: adcl $0, %eax286; X64-NEXT: subl %esi, %eax287; X64-NEXT: retq288 %shift = lshr i32 %z, 16289 %mask = and i32 %shift, 1290 %sub0 = sub i32 %y, %mask291 %sub1 = sub i32 %x, %sub0292 ret i32 %sub1293}294 295define i32 @test_i32_sub_sub_commute_idx(i32 %x, i32 %y, i32 %z) nounwind {296; X86-LABEL: test_i32_sub_sub_commute_idx:297; X86: # %bb.0:298; X86-NEXT: movl {{[0-9]+}}(%esp), %eax299; X86-NEXT: btl $15, {{[0-9]+}}(%esp)300; X86-NEXT: sbbl {{[0-9]+}}(%esp), %eax301; X86-NEXT: retl302;303; X64-LABEL: test_i32_sub_sub_commute_idx:304; X64: # %bb.0:305; X64-NEXT: movl %edi, %eax306; X64-NEXT: btl $15, %edx307; X64-NEXT: sbbl %esi, %eax308; X64-NEXT: retq309 %shift = lshr i32 %z, 15310 %mask = and i32 %shift, 1311 %sub0 = sub i32 %x, %y312 %sub1 = sub i32 %sub0, %mask313 ret i32 %sub1314}315 316define i32 @test_i32_sub_sum_idx(i32 %x, i32 %y, i32 %z) nounwind {317; X86-LABEL: test_i32_sub_sum_idx:318; X86: # %bb.0:319; X86-NEXT: movl {{[0-9]+}}(%esp), %eax320; X86-NEXT: addl {{[0-9]+}}(%esp), %eax321; X86-NEXT: btl $30, {{[0-9]+}}(%esp)322; X86-NEXT: sbbl $0, %eax323; X86-NEXT: negl %eax324; X86-NEXT: retl325;326; X64-LABEL: test_i32_sub_sum_idx:327; X64: # %bb.0:328; X64-NEXT: # kill: def $esi killed $esi def $rsi329; X64-NEXT: # kill: def $edi killed $edi def $rdi330; X64-NEXT: leal (%rdi,%rsi), %eax331; X64-NEXT: btl $30, %edx332; X64-NEXT: sbbl $0, %eax333; X64-NEXT: negl %eax334; X64-NEXT: retq335 %shift = lshr i32 %z, 30336 %mask = and i32 %shift, 1337 %add = add i32 %y, %x338 %sub = sub i32 %mask, %add339 ret i32 %sub340}341 342;343; Variable Bit Indices344;345 346define i32 @test_i32_add_add_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {347; X86-LABEL: test_i32_add_add_var:348; X86: # %bb.0:349; X86-NEXT: movl {{[0-9]+}}(%esp), %eax350; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx351; X86-NEXT: movl {{[0-9]+}}(%esp), %edx352; X86-NEXT: btl %ecx, %edx353; X86-NEXT: adcl {{[0-9]+}}(%esp), %eax354; X86-NEXT: retl355;356; X64-LABEL: test_i32_add_add_var:357; X64: # %bb.0:358; X64-NEXT: movl %edi, %eax359; X64-NEXT: btl %ecx, %edx360; X64-NEXT: adcl %esi, %eax361; X64-NEXT: retq362 %add = add i32 %y, %x363 %shift = lshr i32 %z, %w364 %mask = and i32 %shift, 1365 %add1 = add i32 %add, %mask366 ret i32 %add1367}368 369define i32 @test_i32_add_add_commute_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {370; X86-LABEL: test_i32_add_add_commute_var:371; X86: # %bb.0:372; X86-NEXT: movl {{[0-9]+}}(%esp), %eax373; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx374; X86-NEXT: movl {{[0-9]+}}(%esp), %edx375; X86-NEXT: btl %ecx, %edx376; X86-NEXT: adcl {{[0-9]+}}(%esp), %eax377; X86-NEXT: retl378;379; X64-LABEL: test_i32_add_add_commute_var:380; X64: # %bb.0:381; X64-NEXT: movl %edi, %eax382; X64-NEXT: btl %ecx, %edx383; X64-NEXT: adcl %esi, %eax384; X64-NEXT: retq385 %add = add i32 %y, %x386 %shift = lshr i32 %z, %w387 %mask = and i32 %shift, 1388 %add1 = add i32 %mask, %add389 ret i32 %add1390}391 392define i64 @test_i64_add_add_var(i64 %x, i64 %y, i64 %z, i64 %w) nounwind {393; X86-LABEL: test_i64_add_add_var:394; X86: # %bb.0:395; X86-NEXT: pushl %ebx396; X86-NEXT: pushl %edi397; X86-NEXT: pushl %esi398; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx399; X86-NEXT: movl {{[0-9]+}}(%esp), %esi400; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx401; X86-NEXT: movl {{[0-9]+}}(%esp), %eax402; X86-NEXT: movl {{[0-9]+}}(%esp), %edx403; X86-NEXT: addl {{[0-9]+}}(%esp), %eax404; X86-NEXT: adcl {{[0-9]+}}(%esp), %edx405; X86-NEXT: movl %ebx, %edi406; X86-NEXT: shrl %cl, %edi407; X86-NEXT: shrdl %cl, %ebx, %esi408; X86-NEXT: testb $32, %cl409; X86-NEXT: jne .LBB15_2410; X86-NEXT: # %bb.1:411; X86-NEXT: movl %esi, %edi412; X86-NEXT: .LBB15_2:413; X86-NEXT: andl $1, %edi414; X86-NEXT: addl %edi, %eax415; X86-NEXT: adcl $0, %edx416; X86-NEXT: popl %esi417; X86-NEXT: popl %edi418; X86-NEXT: popl %ebx419; X86-NEXT: retl420;421; X64-LABEL: test_i64_add_add_var:422; X64: # %bb.0:423; X64-NEXT: movq %rdi, %rax424; X64-NEXT: btq %rcx, %rdx425; X64-NEXT: adcq %rsi, %rax426; X64-NEXT: retq427 %add = add i64 %y, %x428 %shift = lshr i64 %z, %w429 %mask = and i64 %shift, 1430 %add1 = add i64 %add, %mask431 ret i64 %add1432}433 434define i32 @test_i32_add_sub_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {435; X86-LABEL: test_i32_add_sub_var:436; X86: # %bb.0:437; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx438; X86-NEXT: movl {{[0-9]+}}(%esp), %edx439; X86-NEXT: movl {{[0-9]+}}(%esp), %eax440; X86-NEXT: subl {{[0-9]+}}(%esp), %eax441; X86-NEXT: btl %ecx, %edx442; X86-NEXT: adcl $0, %eax443; X86-NEXT: retl444;445; X64-LABEL: test_i32_add_sub_var:446; X64: # %bb.0:447; X64-NEXT: movl %edi, %eax448; X64-NEXT: subl %esi, %eax449; X64-NEXT: btl %ecx, %edx450; X64-NEXT: adcl $0, %eax451; X64-NEXT: retq452 %sub = sub i32 %x, %y453 %shift = lshr i32 %z, %w454 %mask = and i32 %shift, 1455 %add = add i32 %sub, %mask456 ret i32 %add457}458 459define i32 @test_i32_add_sub_commute_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {460; X86-LABEL: test_i32_add_sub_commute_var:461; X86: # %bb.0:462; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx463; X86-NEXT: movl {{[0-9]+}}(%esp), %edx464; X86-NEXT: movl {{[0-9]+}}(%esp), %eax465; X86-NEXT: subl {{[0-9]+}}(%esp), %eax466; X86-NEXT: btl %ecx, %edx467; X86-NEXT: adcl $0, %eax468; X86-NEXT: retl469;470; X64-LABEL: test_i32_add_sub_commute_var:471; X64: # %bb.0:472; X64-NEXT: movl %edi, %eax473; X64-NEXT: subl %esi, %eax474; X64-NEXT: btl %ecx, %edx475; X64-NEXT: adcl $0, %eax476; X64-NEXT: retq477 %sub = sub i32 %x, %y478 %shift = lshr i32 %z, %w479 %mask = and i32 %shift, 1480 %add = add i32 %mask, %sub481 ret i32 %add482}483 484define i32 @test_i32_sub_add_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {485; X86-LABEL: test_i32_sub_add_var:486; X86: # %bb.0:487; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx488; X86-NEXT: movl {{[0-9]+}}(%esp), %edx489; X86-NEXT: movl {{[0-9]+}}(%esp), %eax490; X86-NEXT: addl {{[0-9]+}}(%esp), %eax491; X86-NEXT: btl %ecx, %edx492; X86-NEXT: sbbl $0, %eax493; X86-NEXT: retl494;495; X64-LABEL: test_i32_sub_add_var:496; X64: # %bb.0:497; X64-NEXT: # kill: def $esi killed $esi def $rsi498; X64-NEXT: # kill: def $edi killed $edi def $rdi499; X64-NEXT: leal (%rdi,%rsi), %eax500; X64-NEXT: btl %ecx, %edx501; X64-NEXT: sbbl $0, %eax502; X64-NEXT: retq503 %add = add i32 %y, %x504 %shift = lshr i32 %z, %w505 %mask = and i32 %shift, 1506 %sub = sub i32 %add, %mask507 ret i32 %sub508}509 510define i32 @test_i32_sub_add_commute_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {511; X86-LABEL: test_i32_sub_add_commute_var:512; X86: # %bb.0:513; X86-NEXT: movl {{[0-9]+}}(%esp), %eax514; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx515; X86-NEXT: movl {{[0-9]+}}(%esp), %edx516; X86-NEXT: btl %ecx, %edx517; X86-NEXT: sbbl {{[0-9]+}}(%esp), %eax518; X86-NEXT: retl519;520; X64-LABEL: test_i32_sub_add_commute_var:521; X64: # %bb.0:522; X64-NEXT: movl %edi, %eax523; X64-NEXT: btl %ecx, %edx524; X64-NEXT: sbbl %esi, %eax525; X64-NEXT: retq526 %shift = lshr i32 %z, %w527 %mask = and i32 %shift, 1528 %add = add i32 %y, %mask529 %sub = sub i32 %x, %add530 ret i32 %sub531}532 533define i32 @test_i32_sub_add_sext_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {534; X86-LABEL: test_i32_sub_add_sext_var:535; X86: # %bb.0:536; X86-NEXT: movl {{[0-9]+}}(%esp), %eax537; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx538; X86-NEXT: movl {{[0-9]+}}(%esp), %edx539; X86-NEXT: shll %cl, %edx540; X86-NEXT: sarl $31, %edx541; X86-NEXT: addl {{[0-9]+}}(%esp), %edx542; X86-NEXT: subl %edx, %eax543; X86-NEXT: retl544;545; X64-LABEL: test_i32_sub_add_sext_var:546; X64: # %bb.0:547; X64-NEXT: movl %edi, %eax548; X64-NEXT: # kill: def $cl killed $cl killed $ecx549; X64-NEXT: shll %cl, %edx550; X64-NEXT: sarl $31, %edx551; X64-NEXT: addl %esi, %edx552; X64-NEXT: subl %edx, %eax553; X64-NEXT: retq554 %shl = shl i32 %z, %w555 %sext = ashr i32 %shl, 31556 %add = add i32 %y, %sext557 %sub = sub i32 %x, %add558 ret i32 %sub559}560 561define i32 @test_i32_sub_sub_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {562; X86-LABEL: test_i32_sub_sub_var:563; X86: # %bb.0:564; X86-NEXT: movl {{[0-9]+}}(%esp), %eax565; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx566; X86-NEXT: movl {{[0-9]+}}(%esp), %edx567; X86-NEXT: btl %ecx, %edx568; X86-NEXT: adcl $0, %eax569; X86-NEXT: subl {{[0-9]+}}(%esp), %eax570; X86-NEXT: retl571;572; X64-LABEL: test_i32_sub_sub_var:573; X64: # %bb.0:574; X64-NEXT: movl %edi, %eax575; X64-NEXT: btl %ecx, %edx576; X64-NEXT: adcl $0, %eax577; X64-NEXT: subl %esi, %eax578; X64-NEXT: retq579 %shift = lshr i32 %z, %w580 %mask = and i32 %shift, 1581 %sub0 = sub i32 %y, %mask582 %sub1 = sub i32 %x, %sub0583 ret i32 %sub1584}585 586define i32 @test_i32_sub_sub_commute_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {587; X86-LABEL: test_i32_sub_sub_commute_var:588; X86: # %bb.0:589; X86-NEXT: movl {{[0-9]+}}(%esp), %eax590; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx591; X86-NEXT: movl {{[0-9]+}}(%esp), %edx592; X86-NEXT: btl %ecx, %edx593; X86-NEXT: sbbl {{[0-9]+}}(%esp), %eax594; X86-NEXT: retl595;596; X64-LABEL: test_i32_sub_sub_commute_var:597; X64: # %bb.0:598; X64-NEXT: movl %edi, %eax599; X64-NEXT: btl %ecx, %edx600; X64-NEXT: sbbl %esi, %eax601; X64-NEXT: retq602 %shift = lshr i32 %z, %w603 %mask = and i32 %shift, 1604 %sub0 = sub i32 %x, %y605 %sub1 = sub i32 %sub0, %mask606 ret i32 %sub1607}608 609define i32 @test_i32_sub_sum_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {610; X86-LABEL: test_i32_sub_sum_var:611; X86: # %bb.0:612; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx613; X86-NEXT: movl {{[0-9]+}}(%esp), %edx614; X86-NEXT: movl {{[0-9]+}}(%esp), %eax615; X86-NEXT: addl {{[0-9]+}}(%esp), %eax616; X86-NEXT: btl %ecx, %edx617; X86-NEXT: sbbl $0, %eax618; X86-NEXT: negl %eax619; X86-NEXT: retl620;621; X64-LABEL: test_i32_sub_sum_var:622; X64: # %bb.0:623; X64-NEXT: # kill: def $esi killed $esi def $rsi624; X64-NEXT: # kill: def $edi killed $edi def $rdi625; X64-NEXT: leal (%rdi,%rsi), %eax626; X64-NEXT: btl %ecx, %edx627; X64-NEXT: sbbl $0, %eax628; X64-NEXT: negl %eax629; X64-NEXT: retq630 %shift = lshr i32 %z, %w631 %mask = and i32 %shift, 1632 %add = add i32 %y, %x633 %sub = sub i32 %mask, %add634 ret i32 %sub635}636