brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.5 KiB · 6eddf50 Raw
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