1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s -check-prefix=X64 3; RUN: llc < %s -mtriple=i686-apple-darwin | FileCheck %s -check-prefix=X32 4 5; rdar://7329206 6 7; In 32-bit the partial register stall would degrade performance. 8 9define zeroext i16 @test1(i16 zeroext %c, i16 zeroext %k) nounwind ssp { 10; X64-LABEL: test1: 11; X64: ## %bb.0: ## %entry 12; X64-NEXT: movl %esi, %eax 13; X64-NEXT: incl %eax 14; X64-NEXT: cmpw %di, %si 15; X64-NEXT: jne LBB0_2 16; X64-NEXT: ## %bb.1: ## %bb 17; X64-NEXT: pushq %rbx 18; X64-NEXT: movzwl %ax, %ebx 19; X64-NEXT: movl %ebx, %edi 20; X64-NEXT: callq _foo 21; X64-NEXT: movl %ebx, %eax 22; X64-NEXT: popq %rbx 23; X64-NEXT: retq 24; X64-NEXT: LBB0_2: ## %bb1 25; X64-NEXT: movzwl %ax, %eax 26; X64-NEXT: retq 27; 28; X32-LABEL: test1: 29; X32: ## %bb.0: ## %entry 30; X32-NEXT: pushl %esi 31; X32-NEXT: subl $8, %esp 32; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 33; X32-NEXT: movl %ecx, %eax 34; X32-NEXT: incl %eax 35; X32-NEXT: cmpw {{[0-9]+}}(%esp), %cx 36; X32-NEXT: jne LBB0_2 37; X32-NEXT: ## %bb.1: ## %bb 38; X32-NEXT: movzwl %ax, %esi 39; X32-NEXT: movl %esi, (%esp) 40; X32-NEXT: calll _foo 41; X32-NEXT: movl %esi, %eax 42; X32-NEXT: jmp LBB0_3 43; X32-NEXT: LBB0_2: ## %bb1 44; X32-NEXT: movzwl %ax, %eax 45; X32-NEXT: LBB0_3: ## %bb1 46; X32-NEXT: addl $8, %esp 47; X32-NEXT: popl %esi 48; X32-NEXT: retl 49entry: 50 %0 = icmp eq i16 %k, %c 51 %1 = add i16 %k, 1 52 br i1 %0, label %bb, label %bb1 53 54bb: 55 tail call void @foo(i16 zeroext %1) nounwind 56 ret i16 %1 57 58bb1: 59 ret i16 %1 60} 61 62define zeroext i16 @test2(i16 zeroext %c, i16 zeroext %k) nounwind ssp { 63; X64-LABEL: test2: 64; X64: ## %bb.0: ## %entry 65; X64-NEXT: movl %esi, %eax 66; X64-NEXT: decl %eax 67; X64-NEXT: cmpw %di, %si 68; X64-NEXT: jne LBB1_2 69; X64-NEXT: ## %bb.1: ## %bb 70; X64-NEXT: pushq %rbx 71; X64-NEXT: movzwl %ax, %ebx 72; X64-NEXT: movl %ebx, %edi 73; X64-NEXT: callq _foo 74; X64-NEXT: movl %ebx, %eax 75; X64-NEXT: popq %rbx 76; X64-NEXT: retq 77; X64-NEXT: LBB1_2: ## %bb1 78; X64-NEXT: movzwl %ax, %eax 79; X64-NEXT: retq 80; 81; X32-LABEL: test2: 82; X32: ## %bb.0: ## %entry 83; X32-NEXT: pushl %esi 84; X32-NEXT: subl $8, %esp 85; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 86; X32-NEXT: movl %ecx, %eax 87; X32-NEXT: decl %eax 88; X32-NEXT: cmpw {{[0-9]+}}(%esp), %cx 89; X32-NEXT: jne LBB1_2 90; X32-NEXT: ## %bb.1: ## %bb 91; X32-NEXT: movzwl %ax, %esi 92; X32-NEXT: movl %esi, (%esp) 93; X32-NEXT: calll _foo 94; X32-NEXT: movl %esi, %eax 95; X32-NEXT: jmp LBB1_3 96; X32-NEXT: LBB1_2: ## %bb1 97; X32-NEXT: movzwl %ax, %eax 98; X32-NEXT: LBB1_3: ## %bb1 99; X32-NEXT: addl $8, %esp 100; X32-NEXT: popl %esi 101; X32-NEXT: retl 102entry: 103 %0 = icmp eq i16 %k, %c 104 %1 = add i16 %k, -1 105 br i1 %0, label %bb, label %bb1 106 107bb: 108 tail call void @foo(i16 zeroext %1) nounwind 109 ret i16 %1 110 111bb1: 112 ret i16 %1 113} 114 115declare void @foo(i16 zeroext) 116 117define zeroext i16 @test3(i16 zeroext %c, i16 zeroext %k) nounwind ssp { 118; X64-LABEL: test3: 119; X64: ## %bb.0: ## %entry 120; X64-NEXT: movl %esi, %eax 121; X64-NEXT: addl $2, %eax 122; X64-NEXT: cmpw %di, %si 123; X64-NEXT: jne LBB2_2 124; X64-NEXT: ## %bb.1: ## %bb 125; X64-NEXT: pushq %rbx 126; X64-NEXT: movzwl %ax, %ebx 127; X64-NEXT: movl %ebx, %edi 128; X64-NEXT: callq _foo 129; X64-NEXT: movl %ebx, %eax 130; X64-NEXT: popq %rbx 131; X64-NEXT: retq 132; X64-NEXT: LBB2_2: ## %bb1 133; X64-NEXT: movzwl %ax, %eax 134; X64-NEXT: retq 135; 136; X32-LABEL: test3: 137; X32: ## %bb.0: ## %entry 138; X32-NEXT: pushl %esi 139; X32-NEXT: subl $8, %esp 140; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 141; X32-NEXT: movl %ecx, %eax 142; X32-NEXT: addl $2, %eax 143; X32-NEXT: cmpw {{[0-9]+}}(%esp), %cx 144; X32-NEXT: jne LBB2_2 145; X32-NEXT: ## %bb.1: ## %bb 146; X32-NEXT: movzwl %ax, %esi 147; X32-NEXT: movl %esi, (%esp) 148; X32-NEXT: calll _foo 149; X32-NEXT: movl %esi, %eax 150; X32-NEXT: jmp LBB2_3 151; X32-NEXT: LBB2_2: ## %bb1 152; X32-NEXT: movzwl %ax, %eax 153; X32-NEXT: LBB2_3: ## %bb1 154; X32-NEXT: addl $8, %esp 155; X32-NEXT: popl %esi 156; X32-NEXT: retl 157entry: 158 %0 = add i16 %k, 2 159 %1 = icmp eq i16 %k, %c 160 br i1 %1, label %bb, label %bb1 161 162bb: 163 tail call void @foo(i16 zeroext %0) nounwind 164 ret i16 %0 165 166bb1: 167 ret i16 %0 168} 169 170define zeroext i16 @test4(i16 zeroext %c, i16 zeroext %k) nounwind ssp { 171; X64-LABEL: test4: 172; X64: ## %bb.0: ## %entry 173; X64-NEXT: movl %esi, %eax 174; X64-NEXT: addl %edi, %eax 175; X64-NEXT: cmpw %di, %si 176; X64-NEXT: jne LBB3_2 177; X64-NEXT: ## %bb.1: ## %bb 178; X64-NEXT: pushq %rbx 179; X64-NEXT: movzwl %ax, %ebx 180; X64-NEXT: movl %ebx, %edi 181; X64-NEXT: callq _foo 182; X64-NEXT: movl %ebx, %eax 183; X64-NEXT: popq %rbx 184; X64-NEXT: retq 185; X64-NEXT: LBB3_2: ## %bb1 186; X64-NEXT: movzwl %ax, %eax 187; X64-NEXT: retq 188; 189; X32-LABEL: test4: 190; X32: ## %bb.0: ## %entry 191; X32-NEXT: pushl %esi 192; X32-NEXT: subl $8, %esp 193; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 194; X32-NEXT: movl {{[0-9]+}}(%esp), %edx 195; X32-NEXT: movl %edx, %eax 196; X32-NEXT: addl %ecx, %eax 197; X32-NEXT: cmpw %cx, %dx 198; X32-NEXT: jne LBB3_2 199; X32-NEXT: ## %bb.1: ## %bb 200; X32-NEXT: movzwl %ax, %esi 201; X32-NEXT: movl %esi, (%esp) 202; X32-NEXT: calll _foo 203; X32-NEXT: movl %esi, %eax 204; X32-NEXT: jmp LBB3_3 205; X32-NEXT: LBB3_2: ## %bb1 206; X32-NEXT: movzwl %ax, %eax 207; X32-NEXT: LBB3_3: ## %bb1 208; X32-NEXT: addl $8, %esp 209; X32-NEXT: popl %esi 210; X32-NEXT: retl 211entry: 212 %0 = add i16 %k, %c 213 %1 = icmp eq i16 %k, %c 214 br i1 %1, label %bb, label %bb1 215 216bb: 217 tail call void @foo(i16 zeroext %0) nounwind 218 ret i16 %0 219 220bb1: 221 ret i16 %0 222} 223 224