389 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s3 4; PR33879 - 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: movl %edx, %eax11; CHECK-NEXT: sarl $14, %edi12; CHECK-NEXT: cmovnel %ecx, %eax13; CHECK-NEXT: retq14 %s = ashr i32 %a0, 1415 %c = icmp eq i32 %s, 016 %r = select i1 %c, i32 %a2, i32 %a317 ret i32 %r18}19 20; lshr by constant - simplify to test21define i32 @lshr_const(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {22; CHECK-LABEL: lshr_const:23; CHECK: # %bb.0:24; CHECK-NEXT: movl %edx, %eax25; CHECK-NEXT: testl $-16384, %edi # imm = 0xC00026; CHECK-NEXT: cmovnel %ecx, %eax27; CHECK-NEXT: retq28 %s = lshr i32 %a0, 1429 %c = icmp eq i32 %s, 030 %r = select i1 %c, i32 %a2, i32 %a331 ret i32 %r32}33 34; shl by constant - simplify to test35define i32 @shl_const(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {36; CHECK-LABEL: shl_const:37; CHECK: # %bb.0:38; CHECK-NEXT: movl %edx, %eax39; CHECK-NEXT: testl $262143, %edi # imm = 0x3FFFF40; CHECK-NEXT: cmovnel %ecx, %eax41; CHECK-NEXT: retq42 %s = shl i32 %a0, 1443 %c = icmp eq i32 %s, 044 %r = select i1 %c, i32 %a2, i32 %a345 ret i32 %r46}47 48; ashr by constant and using shift result - use sarl eflags result49define i32 @ashr_const_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {50; CHECK-LABEL: ashr_const_self_select:51; CHECK: # %bb.0:52; CHECK-NEXT: movl %edi, %eax53; CHECK-NEXT: sarl $14, %eax54; CHECK-NEXT: cmovnel %edx, %eax55; CHECK-NEXT: retq56 %s = ashr i32 %a0, 1457 %c = icmp eq i32 %s, 058 %r = select i1 %c, i32 %s, i32 %a259 ret i32 %r60}61 62; lshr by constant and using shift result - use shrl eflags result63define i32 @lshr_const_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {64; CHECK-LABEL: lshr_const_self_select:65; CHECK: # %bb.0:66; CHECK-NEXT: movl %edi, %eax67; CHECK-NEXT: shrl $14, %eax68; CHECK-NEXT: cmovnel %edx, %eax69; CHECK-NEXT: retq70 %s = lshr i32 %a0, 1471 %c = icmp eq i32 %s, 072 %r = select i1 %c, i32 %s, i32 %a273 ret i32 %r74}75 76; lshr by constant and using result - use shll eflags result77define i32 @shl_const_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {78; CHECK-LABEL: shl_const_self_select:79; CHECK: # %bb.0:80; CHECK-NEXT: movl %edi, %eax81; CHECK-NEXT: shll $14, %eax82; CHECK-NEXT: cmovnel %edx, %eax83; CHECK-NEXT: retq84 %s = shl i32 %a0, 1485 %c = icmp eq i32 %s, 086 %r = select i1 %c, i32 %s, i32 %a287 ret i32 %r88}89 90; ashr by 1 - use sarl eflags result91define i32 @ashr_const1(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {92; CHECK-LABEL: ashr_const1:93; CHECK: # %bb.0:94; CHECK-NEXT: movl %edx, %eax95; CHECK-NEXT: sarl %edi96; CHECK-NEXT: cmovnel %ecx, %eax97; CHECK-NEXT: retq98 %s = ashr i32 %a0, 199 %c = icmp eq i32 %s, 0100 %r = select i1 %c, i32 %a2, i32 %a3101 ret i32 %r102}103 104; lshr by 1 - simplify to test105define i32 @lshr_const1(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {106; CHECK-LABEL: lshr_const1:107; CHECK: # %bb.0:108; CHECK-NEXT: movl %edx, %eax109; CHECK-NEXT: testl $-2, %edi110; CHECK-NEXT: cmovnel %ecx, %eax111; CHECK-NEXT: retq112 %s = lshr i32 %a0, 1113 %c = icmp eq i32 %s, 0114 %r = select i1 %c, i32 %a2, i32 %a3115 ret i32 %r116}117 118; shl by 1 - simplify to test119define i32 @shl_const1(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {120; CHECK-LABEL: shl_const1:121; CHECK: # %bb.0:122; CHECK-NEXT: movl %edx, %eax123; CHECK-NEXT: testl $2147483647, %edi # imm = 0x7FFFFFFF124; CHECK-NEXT: cmovnel %ecx, %eax125; CHECK-NEXT: retq126 %s = shl i32 %a0, 1127 %c = icmp eq i32 %s, 0128 %r = select i1 %c, i32 %a2, i32 %a3129 ret i32 %r130}131 132; ashr by 1 and using shift result - use sarl eflags result133define i32 @ashr_const1_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {134; CHECK-LABEL: ashr_const1_self_select:135; CHECK: # %bb.0:136; CHECK-NEXT: movl %edi, %eax137; CHECK-NEXT: sarl %eax138; CHECK-NEXT: cmovnel %edx, %eax139; CHECK-NEXT: retq140 %s = ashr i32 %a0, 1141 %c = icmp eq i32 %s, 0142 %r = select i1 %c, i32 %s, i32 %a2143 ret i32 %r144}145 146; lshr by 1 and using shift result - use shrl eflags result147define i32 @lshr_const1_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {148; CHECK-LABEL: lshr_const1_self_select:149; CHECK: # %bb.0:150; CHECK-NEXT: movl %edi, %eax151; CHECK-NEXT: shrl %eax152; CHECK-NEXT: cmovnel %edx, %eax153; CHECK-NEXT: retq154 %s = lshr i32 %a0, 1155 %c = icmp eq i32 %s, 0156 %r = select i1 %c, i32 %s, i32 %a2157 ret i32 %r158}159 160; lshr by 1 and using result - use addl eflags result161define i32 @shl_const1_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {162; CHECK-LABEL: shl_const1_self_select:163; CHECK: # %bb.0:164; CHECK-NEXT: movl %edi, %eax165; CHECK-NEXT: addl %edi, %eax166; CHECK-NEXT: cmovnel %edx, %eax167; CHECK-NEXT: retq168 %s = shl i32 %a0, 1169 %c = icmp eq i32 %s, 0170 %r = select i1 %c, i32 %s, i32 %a2171 ret i32 %r172}173 174; ashr by variable - use separate test175define i32 @ashr_var(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {176; CHECK-LABEL: ashr_var:177; CHECK: # %bb.0:178; CHECK-NEXT: movl %ecx, %eax179; CHECK-NEXT: movl %esi, %ecx180; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx181; CHECK-NEXT: sarl %cl, %edi182; CHECK-NEXT: testl %edi, %edi183; CHECK-NEXT: cmovel %edx, %eax184; CHECK-NEXT: retq185 %s = ashr i32 %a0, %a1186 %c = icmp eq i32 %s, 0187 %r = select i1 %c, i32 %a2, i32 %a3188 ret i32 %r189}190 191; lshr by variable - use separate test192define i32 @lshr_var(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {193; CHECK-LABEL: lshr_var:194; CHECK: # %bb.0:195; CHECK-NEXT: movl %ecx, %eax196; CHECK-NEXT: movl %esi, %ecx197; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx198; CHECK-NEXT: shrl %cl, %edi199; CHECK-NEXT: testl %edi, %edi200; CHECK-NEXT: cmovel %edx, %eax201; CHECK-NEXT: retq202 %s = lshr i32 %a0, %a1203 %c = icmp eq i32 %s, 0204 %r = select i1 %c, i32 %a2, i32 %a3205 ret i32 %r206}207 208; shl by variable - use separate test209define i32 @shl_var(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {210; CHECK-LABEL: shl_var:211; CHECK: # %bb.0:212; CHECK-NEXT: movl %ecx, %eax213; CHECK-NEXT: movl %esi, %ecx214; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx215; CHECK-NEXT: shll %cl, %edi216; CHECK-NEXT: testl %edi, %edi217; CHECK-NEXT: cmovel %edx, %eax218; CHECK-NEXT: retq219 %s = shl i32 %a0, %a1220 %c = icmp eq i32 %s, 0221 %r = select i1 %c, i32 %a2, i32 %a3222 ret i32 %r223}224 225; ashr by variable and using result - use separate test226define i32 @ashr_var_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {227; CHECK-LABEL: ashr_var_self_select:228; CHECK: # %bb.0:229; CHECK-NEXT: movl %esi, %ecx230; CHECK-NEXT: movl %edi, %eax231; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx232; CHECK-NEXT: sarl %cl, %eax233; CHECK-NEXT: testl %eax, %eax234; CHECK-NEXT: cmovnel %edx, %eax235; CHECK-NEXT: retq236 %s = ashr i32 %a0, %a1237 %c = icmp eq i32 %s, 0238 %r = select i1 %c, i32 %s, i32 %a2239 ret i32 %r240}241 242; lshr by variable and using result - use separate test243define i32 @lshr_var_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {244; CHECK-LABEL: lshr_var_self_select:245; CHECK: # %bb.0:246; CHECK-NEXT: movl %esi, %ecx247; CHECK-NEXT: movl %edi, %eax248; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx249; CHECK-NEXT: shrl %cl, %eax250; CHECK-NEXT: testl %eax, %eax251; CHECK-NEXT: cmovnel %edx, %eax252; CHECK-NEXT: retq253 %s = lshr i32 %a0, %a1254 %c = icmp eq i32 %s, 0255 %r = select i1 %c, i32 %s, i32 %a2256 ret i32 %r257}258 259; shl by variable and using result - use separate test260define i32 @shl_var_self_select(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {261; CHECK-LABEL: shl_var_self_select:262; CHECK: # %bb.0:263; CHECK-NEXT: movl %esi, %ecx264; CHECK-NEXT: movl %edi, %eax265; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx266; CHECK-NEXT: shll %cl, %eax267; CHECK-NEXT: testl %eax, %eax268; CHECK-NEXT: cmovnel %edx, %eax269; CHECK-NEXT: retq270 %s = shl i32 %a0, %a1271 %c = icmp eq i32 %s, 0272 %r = select i1 %c, i32 %s, i32 %a2273 ret i32 %r274}275 276; ashr by non-zero variable - use separate test277define i32 @ashr_var_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {278; CHECK-LABEL: ashr_var_amt_never_zero:279; CHECK: # %bb.0:280; CHECK-NEXT: movl %ecx, %eax281; CHECK-NEXT: movl %esi, %ecx282; CHECK-NEXT: orb $1, %cl283; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx284; CHECK-NEXT: sarl %cl, %edi285; CHECK-NEXT: testl %edi, %edi286; CHECK-NEXT: cmovel %edx, %eax287; CHECK-NEXT: retq288 %a = or i32 %a1, 1289 %s = ashr i32 %a0, %a290 %c = icmp eq i32 %s, 0291 %r = select i1 %c, i32 %a2, i32 %a3292 ret i32 %r293}294 295; lshr by non-zero variable - use separate test296define i32 @lshr_var_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {297; CHECK-LABEL: lshr_var_amt_never_zero:298; CHECK: # %bb.0:299; CHECK-NEXT: movl %ecx, %eax300; CHECK-NEXT: movl %esi, %ecx301; CHECK-NEXT: orb $1, %cl302; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx303; CHECK-NEXT: shrl %cl, %edi304; CHECK-NEXT: testl %edi, %edi305; CHECK-NEXT: cmovel %edx, %eax306; CHECK-NEXT: retq307 %a = or i32 %a1, 1308 %s = lshr i32 %a0, %a309 %c = icmp eq i32 %s, 0310 %r = select i1 %c, i32 %a2, i32 %a3311 ret i32 %r312}313 314; shl by non-zero variable - use separate test315define i32 @shl_var_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {316; CHECK-LABEL: shl_var_amt_never_zero:317; CHECK: # %bb.0:318; CHECK-NEXT: movl %ecx, %eax319; CHECK-NEXT: movl %esi, %ecx320; CHECK-NEXT: orb $1, %cl321; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx322; CHECK-NEXT: shll %cl, %edi323; CHECK-NEXT: testl %edi, %edi324; CHECK-NEXT: cmovel %edx, %eax325; CHECK-NEXT: retq326 %a = or i32 %a1, 1327 %s = shl i32 %a0, %a328 %c = icmp eq i32 %s, 0329 %r = select i1 %c, i32 %a2, i32 %a3330 ret i32 %r331}332 333; ashr by non-zero variable and using result - use separate test334define i32 @ashr_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {335; CHECK-LABEL: ashr_var_self_select_amt_never_zero:336; CHECK: # %bb.0:337; CHECK-NEXT: movl %esi, %ecx338; CHECK-NEXT: movl %edi, %eax339; CHECK-NEXT: orb $1, %cl340; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx341; CHECK-NEXT: shrl %cl, %eax342; CHECK-NEXT: testl %eax, %eax343; CHECK-NEXT: cmovnel %edx, %eax344; CHECK-NEXT: retq345 %a = or i32 %a1, 1346 %s = lshr i32 %a0, %a347 %c = icmp eq i32 %s, 0348 %r = select i1 %c, i32 %s, i32 %a2349 ret i32 %r350}351 352; lshr by non-zero variable and using result - use separate test353define i32 @lshr_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {354; CHECK-LABEL: lshr_var_self_select_amt_never_zero:355; CHECK: # %bb.0:356; CHECK-NEXT: movl %esi, %ecx357; CHECK-NEXT: movl %edi, %eax358; CHECK-NEXT: orb $1, %cl359; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx360; CHECK-NEXT: shrl %cl, %eax361; CHECK-NEXT: testl %eax, %eax362; CHECK-NEXT: cmovnel %edx, %eax363; CHECK-NEXT: retq364 %a = or i32 %a1, 1365 %s = lshr i32 %a0, %a366 %c = icmp eq i32 %s, 0367 %r = select i1 %c, i32 %s, i32 %a2368 ret i32 %r369}370 371; shl by non-zero variable and using result - use separate test372define i32 @shl_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {373; CHECK-LABEL: shl_var_self_select_amt_never_zero:374; CHECK: # %bb.0:375; CHECK-NEXT: movl %esi, %ecx376; CHECK-NEXT: movl %edi, %eax377; CHECK-NEXT: orb $1, %cl378; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx379; CHECK-NEXT: shrl %cl, %eax380; CHECK-NEXT: testl %eax, %eax381; CHECK-NEXT: cmovnel %edx, %eax382; CHECK-NEXT: retq383 %a = or i32 %a1, 1384 %s = lshr i32 %a0, %a385 %c = icmp eq i32 %s, 0386 %r = select i1 %c, i32 %s, i32 %a2387 ret i32 %r388}389