brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.5 KiB · 2659f80 Raw
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