359 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=+ndd | FileCheck %s3 4; Use shift eflags result when it won't cause stalls5 6; ashr by constant - use sarl eflags result7define i32 @ashr_const(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {8; CHECK-LABEL: ashr_const:9; CHECK: # %bb.0:10; CHECK-NEXT: sarl $14, %edi11; CHECK-NEXT: cmovel %edx, %ecx, %eax12; CHECK-NEXT: retq13 %s = ashr i32 %a0, 1414 %c = icmp eq i32 %s, 015 %r = select i1 %c, i32 %a2, i32 %a316 ret i32 %r17}18 19; lshr by constant - simplify to test20define i32 @lshr_const(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {21; CHECK-LABEL: lshr_const:22; CHECK: # %bb.0:23; CHECK-NEXT: testl $-16384, %edi # imm = 0xC00024; CHECK-NEXT: cmovel %edx, %ecx, %eax25; CHECK-NEXT: retq26 %s = lshr i32 %a0, 1427 %c = icmp eq i32 %s, 028 %r = select i1 %c, i32 %a2, i32 %a329 ret i32 %r30}31 32; shl by constant - simplify to test33define i32 @shl_const(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {34; CHECK-LABEL: shl_const:35; CHECK: # %bb.0:36; CHECK-NEXT: testl $262143, %edi # imm = 0x3FFFF37; CHECK-NEXT: cmovel %edx, %ecx, %eax38; CHECK-NEXT: retq39 %s = shl i32 %a0, 1440 %c = icmp eq i32 %s, 041 %r = select i1 %c, i32 %a2, i32 %a342 ret i32 %r43}44 45; ashr by constant and using shift result - use sarl eflags result46define i32 @ashr_const_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {47; CHECK-LABEL: ashr_const_self_select:48; CHECK: # %bb.0:49; CHECK-NEXT: sarl $14, %edi, %eax50; CHECK-NEXT: cmovnel %edx, %eax51; CHECK-NEXT: retq52 %s = ashr i32 %a0, 1453 %c = icmp eq i32 %s, 054 %r = select i1 %c, i32 %s, i32 %a255 ret i32 %r56}57 58; lshr by constant and using shift result - use shrl eflags result59define i32 @lshr_const_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {60; CHECK-LABEL: lshr_const_self_select:61; CHECK: # %bb.0:62; CHECK-NEXT: shrl $14, %edi, %eax63; CHECK-NEXT: cmovnel %edx, %eax64; CHECK-NEXT: retq65 %s = lshr i32 %a0, 1466 %c = icmp eq i32 %s, 067 %r = select i1 %c, i32 %s, i32 %a268 ret i32 %r69}70 71; lshr by constant and using result - use shll eflags result72define i32 @shl_const_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {73; CHECK-LABEL: shl_const_self_select:74; CHECK: # %bb.0:75; CHECK-NEXT: shll $14, %edi, %eax76; CHECK-NEXT: cmovnel %edx, %eax77; CHECK-NEXT: retq78 %s = shl i32 %a0, 1479 %c = icmp eq i32 %s, 080 %r = select i1 %c, i32 %s, i32 %a281 ret i32 %r82}83 84; ashr by 1 - use sarl eflags result85define i32 @ashr_const1(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {86; CHECK-LABEL: ashr_const1:87; CHECK: # %bb.0:88; CHECK-NEXT: sarl %edi89; CHECK-NEXT: cmovel %edx, %ecx, %eax90; CHECK-NEXT: retq91 %s = ashr i32 %a0, 192 %c = icmp eq i32 %s, 093 %r = select i1 %c, i32 %a2, i32 %a394 ret i32 %r95}96 97; lshr by 1 - simplify to test98define i32 @lshr_const1(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {99; CHECK-LABEL: lshr_const1:100; CHECK: # %bb.0:101; CHECK-NEXT: testl $-2, %edi102; CHECK-NEXT: cmovel %edx, %ecx, %eax103; CHECK-NEXT: retq104 %s = lshr i32 %a0, 1105 %c = icmp eq i32 %s, 0106 %r = select i1 %c, i32 %a2, i32 %a3107 ret i32 %r108}109 110; shl by 1 - simplify to test111define i32 @shl_const1(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {112; CHECK-LABEL: shl_const1:113; CHECK: # %bb.0:114; CHECK-NEXT: testl $2147483647, %edi # imm = 0x7FFFFFFF115; CHECK-NEXT: cmovel %edx, %ecx, %eax116; CHECK-NEXT: retq117 %s = shl i32 %a0, 1118 %c = icmp eq i32 %s, 0119 %r = select i1 %c, i32 %a2, i32 %a3120 ret i32 %r121}122 123; ashr by 1 and using shift result - use sarl eflags result124define i32 @ashr_const1_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {125; CHECK-LABEL: ashr_const1_self_select:126; CHECK: # %bb.0:127; CHECK-NEXT: sarl %edi, %eax128; CHECK-NEXT: cmovnel %edx, %eax129; CHECK-NEXT: retq130 %s = ashr i32 %a0, 1131 %c = icmp eq i32 %s, 0132 %r = select i1 %c, i32 %s, i32 %a2133 ret i32 %r134}135 136; lshr by 1 and using shift result - use shrl eflags result137define i32 @lshr_const1_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {138; CHECK-LABEL: lshr_const1_self_select:139; CHECK: # %bb.0:140; CHECK-NEXT: shrl %edi, %eax141; CHECK-NEXT: cmovnel %edx, %eax142; CHECK-NEXT: retq143 %s = lshr i32 %a0, 1144 %c = icmp eq i32 %s, 0145 %r = select i1 %c, i32 %s, i32 %a2146 ret i32 %r147}148 149; lshr by 1 and using result - use addl eflags result150define i32 @shl_const1_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {151; CHECK-LABEL: shl_const1_self_select:152; CHECK: # %bb.0:153; CHECK-NEXT: addl %edi, %edi, %eax154; CHECK-NEXT: cmovnel %edx, %eax155; CHECK-NEXT: retq156 %s = shl i32 %a0, 1157 %c = icmp eq i32 %s, 0158 %r = select i1 %c, i32 %s, i32 %a2159 ret i32 %r160}161 162; ashr by variable - use separate test163define i32 @ashr_var(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {164; CHECK-LABEL: ashr_var:165; CHECK: # %bb.0:166; CHECK-NEXT: movl %ecx, %eax167; CHECK-NEXT: movl %esi, %ecx168; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx169; CHECK-NEXT: sarl %cl, %edi170; CHECK-NEXT: testl %edi, %edi171; CHECK-NEXT: cmovel %edx, %eax172; CHECK-NEXT: retq173 %s = ashr i32 %a0, %a1174 %c = icmp eq i32 %s, 0175 %r = select i1 %c, i32 %a2, i32 %a3176 ret i32 %r177}178 179; lshr by variable - use separate test180define i32 @lshr_var(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {181; CHECK-LABEL: lshr_var:182; CHECK: # %bb.0:183; CHECK-NEXT: movl %ecx, %eax184; CHECK-NEXT: movl %esi, %ecx185; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx186; CHECK-NEXT: shrl %cl, %edi187; CHECK-NEXT: testl %edi, %edi188; CHECK-NEXT: cmovel %edx, %eax189; CHECK-NEXT: retq190 %s = lshr i32 %a0, %a1191 %c = icmp eq i32 %s, 0192 %r = select i1 %c, i32 %a2, i32 %a3193 ret i32 %r194}195 196; shl by variable - use separate test197define i32 @shl_var(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {198; CHECK-LABEL: shl_var:199; CHECK: # %bb.0:200; CHECK-NEXT: movl %ecx, %eax201; CHECK-NEXT: movl %esi, %ecx202; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx203; CHECK-NEXT: shll %cl, %edi204; CHECK-NEXT: testl %edi, %edi205; CHECK-NEXT: cmovel %edx, %eax206; CHECK-NEXT: retq207 %s = shl i32 %a0, %a1208 %c = icmp eq i32 %s, 0209 %r = select i1 %c, i32 %a2, i32 %a3210 ret i32 %r211}212 213; ashr by variable and using result - use separate test214define i32 @ashr_var_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {215; CHECK-LABEL: ashr_var_self_select:216; CHECK: # %bb.0:217; CHECK-NEXT: movl %esi, %ecx218; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx219; CHECK-NEXT: sarl %cl, %edi, %eax220; CHECK-NEXT: testl %eax, %eax221; CHECK-NEXT: cmovnel %edx, %eax222; CHECK-NEXT: retq223 %s = ashr i32 %a0, %a1224 %c = icmp eq i32 %s, 0225 %r = select i1 %c, i32 %s, i32 %a2226 ret i32 %r227}228 229; lshr by variable and using result - use separate test230define i32 @lshr_var_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {231; CHECK-LABEL: lshr_var_self_select:232; CHECK: # %bb.0:233; CHECK-NEXT: movl %esi, %ecx234; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx235; CHECK-NEXT: shrl %cl, %edi, %eax236; CHECK-NEXT: testl %eax, %eax237; CHECK-NEXT: cmovnel %edx, %eax238; CHECK-NEXT: retq239 %s = lshr i32 %a0, %a1240 %c = icmp eq i32 %s, 0241 %r = select i1 %c, i32 %s, i32 %a2242 ret i32 %r243}244 245; shl by variable and using result - use separate test246define i32 @shl_var_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {247; CHECK-LABEL: shl_var_self_select:248; CHECK: # %bb.0:249; CHECK-NEXT: movl %esi, %ecx250; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx251; CHECK-NEXT: shll %cl, %edi, %eax252; CHECK-NEXT: testl %eax, %eax253; CHECK-NEXT: cmovnel %edx, %eax254; CHECK-NEXT: retq255 %s = shl i32 %a0, %a1256 %c = icmp eq i32 %s, 0257 %r = select i1 %c, i32 %s, i32 %a2258 ret i32 %r259}260 261; ashr by non-zero variable - use separate test262define i32 @ashr_var_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {263; CHECK-LABEL: ashr_var_amt_never_zero:264; CHECK: # %bb.0:265; CHECK-NEXT: movl %ecx, %eax266; CHECK-NEXT: orb $1, %sil, %cl267; CHECK-NEXT: sarl %cl, %edi268; CHECK-NEXT: testl %edi, %edi269; CHECK-NEXT: cmovel %edx, %eax270; CHECK-NEXT: retq271 %a = or i32 %a1, 1272 %s = ashr i32 %a0, %a273 %c = icmp eq i32 %s, 0274 %r = select i1 %c, i32 %a2, i32 %a3275 ret i32 %r276}277 278; lshr by non-zero variable - use separate test279define i32 @lshr_var_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {280; CHECK-LABEL: lshr_var_amt_never_zero:281; CHECK: # %bb.0:282; CHECK-NEXT: movl %ecx, %eax283; CHECK-NEXT: orb $1, %sil, %cl284; CHECK-NEXT: shrl %cl, %edi285; CHECK-NEXT: testl %edi, %edi286; CHECK-NEXT: cmovel %edx, %eax287; CHECK-NEXT: retq288 %a = or i32 %a1, 1289 %s = lshr i32 %a0, %a290 %c = icmp eq i32 %s, 0291 %r = select i1 %c, i32 %a2, i32 %a3292 ret i32 %r293}294 295; shl by non-zero variable - use separate test296define i32 @shl_var_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {297; CHECK-LABEL: shl_var_amt_never_zero:298; CHECK: # %bb.0:299; CHECK-NEXT: movl %ecx, %eax300; CHECK-NEXT: orb $1, %sil, %cl301; CHECK-NEXT: shll %cl, %edi302; CHECK-NEXT: testl %edi, %edi303; CHECK-NEXT: cmovel %edx, %eax304; CHECK-NEXT: retq305 %a = or i32 %a1, 1306 %s = shl i32 %a0, %a307 %c = icmp eq i32 %s, 0308 %r = select i1 %c, i32 %a2, i32 %a3309 ret i32 %r310}311 312; ashr by non-zero variable and using result - use separate test313define i32 @ashr_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {314; CHECK-LABEL: ashr_var_self_select_amt_never_zero:315; CHECK: # %bb.0:316; CHECK-NEXT: orb $1, %sil, %cl317; CHECK-NEXT: shrl %cl, %edi, %eax318; CHECK-NEXT: testl %eax, %eax319; CHECK-NEXT: cmovnel %edx, %eax320; CHECK-NEXT: retq321 %a = or i32 %a1, 1322 %s = lshr i32 %a0, %a323 %c = icmp eq i32 %s, 0324 %r = select i1 %c, i32 %s, i32 %a2325 ret i32 %r326}327 328; lshr by non-zero variable and using result - use separate test329define i32 @lshr_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {330; CHECK-LABEL: lshr_var_self_select_amt_never_zero:331; CHECK: # %bb.0:332; CHECK-NEXT: orb $1, %sil, %cl333; CHECK-NEXT: shrl %cl, %edi, %eax334; CHECK-NEXT: testl %eax, %eax335; CHECK-NEXT: cmovnel %edx, %eax336; CHECK-NEXT: retq337 %a = or i32 %a1, 1338 %s = lshr i32 %a0, %a339 %c = icmp eq i32 %s, 0340 %r = select i1 %c, i32 %s, i32 %a2341 ret i32 %r342}343 344; shl by non-zero variable and using result - use separate test345define i32 @shl_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {346; CHECK-LABEL: shl_var_self_select_amt_never_zero:347; CHECK: # %bb.0:348; CHECK-NEXT: orb $1, %sil, %cl349; CHECK-NEXT: shrl %cl, %edi, %eax350; CHECK-NEXT: testl %eax, %eax351; CHECK-NEXT: cmovnel %edx, %eax352; CHECK-NEXT: retq353 %a = or i32 %a1, 1354 %s = lshr i32 %a0, %a355 %c = icmp eq i32 %s, 0356 %r = select i1 %c, i32 %s, i32 %a2357 ret i32 %r358}359