287 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefix=X324 5define i32 @sub_zext_cmp_mask_same_size_result(i32 %x) {6; X64-LABEL: sub_zext_cmp_mask_same_size_result:7; X64: # %bb.0:8; X64-NEXT: # kill: def $edi killed $edi def $rdi9; X64-NEXT: andl $1, %edi10; X64-NEXT: leal -28(%rdi), %eax11; X64-NEXT: retq12;13; X32-LABEL: sub_zext_cmp_mask_same_size_result:14; X32: # %bb.0:15; X32-NEXT: movl {{[0-9]+}}(%esp), %eax16; X32-NEXT: andl $1, %eax17; X32-NEXT: orl $-28, %eax18; X32-NEXT: retl19 %a = and i32 %x, 120 %c = icmp eq i32 %a, 021 %z = zext i1 %c to i3222 %r = sub i32 -27, %z23 ret i32 %r24}25 26define i32 @sub_zext_cmp_mask_wider_result(i8 %x) {27; X64-LABEL: sub_zext_cmp_mask_wider_result:28; X64: # %bb.0:29; X64-NEXT: # kill: def $edi killed $edi def $rdi30; X64-NEXT: andl $1, %edi31; X64-NEXT: leal 26(%rdi), %eax32; X64-NEXT: retq33;34; X32-LABEL: sub_zext_cmp_mask_wider_result:35; X32: # %bb.0:36; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax37; X32-NEXT: andl $1, %eax38; X32-NEXT: orl $26, %eax39; X32-NEXT: retl40 %a = and i8 %x, 141 %c = icmp eq i8 %a, 042 %z = zext i1 %c to i3243 %r = sub i32 27, %z44 ret i32 %r45}46 47define i8 @sub_zext_cmp_mask_narrower_result(i32 %x) {48; X64-LABEL: sub_zext_cmp_mask_narrower_result:49; X64: # %bb.0:50; X64-NEXT: # kill: def $edi killed $edi def $rdi51; X64-NEXT: andb $1, %dil52; X64-NEXT: leal 46(%rdi), %eax53; X64-NEXT: # kill: def $al killed $al killed $eax54; X64-NEXT: retq55;56; X32-LABEL: sub_zext_cmp_mask_narrower_result:57; X32: # %bb.0:58; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax59; X32-NEXT: andb $1, %al60; X32-NEXT: orb $46, %al61; X32-NEXT: retl62 %a = and i32 %x, 163 %c = icmp eq i32 %a, 064 %z = zext i1 %c to i865 %r = sub i8 47, %z66 ret i8 %r67}68 69define i8 @add_zext_cmp_mask_same_size_result(i8 %x) {70; X64-LABEL: add_zext_cmp_mask_same_size_result:71; X64: # %bb.0:72; X64-NEXT: movl %edi, %eax73; X64-NEXT: andb $1, %al74; X64-NEXT: xorb $27, %al75; X64-NEXT: # kill: def $al killed $al killed $eax76; X64-NEXT: retq77;78; X32-LABEL: add_zext_cmp_mask_same_size_result:79; X32: # %bb.0:80; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax81; X32-NEXT: andb $1, %al82; X32-NEXT: xorb $27, %al83; X32-NEXT: retl84 %a = and i8 %x, 185 %c = icmp eq i8 %a, 086 %z = zext i1 %c to i887 %r = add i8 %z, 2688 ret i8 %r89}90 91define i32 @add_zext_cmp_mask_wider_result(i8 %x) {92; X64-LABEL: add_zext_cmp_mask_wider_result:93; X64: # %bb.0:94; X64-NEXT: movl %edi, %eax95; X64-NEXT: andl $1, %eax96; X64-NEXT: xorl $27, %eax97; X64-NEXT: retq98;99; X32-LABEL: add_zext_cmp_mask_wider_result:100; X32: # %bb.0:101; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax102; X32-NEXT: andl $1, %eax103; X32-NEXT: xorl $27, %eax104; X32-NEXT: retl105 %a = and i8 %x, 1106 %c = icmp eq i8 %a, 0107 %z = zext i1 %c to i32108 %r = add i32 %z, 26109 ret i32 %r110}111 112define i8 @add_zext_cmp_mask_narrower_result(i32 %x) {113; X64-LABEL: add_zext_cmp_mask_narrower_result:114; X64: # %bb.0:115; X64-NEXT: movl %edi, %eax116; X64-NEXT: andb $1, %al117; X64-NEXT: xorb $43, %al118; X64-NEXT: # kill: def $al killed $al killed $eax119; X64-NEXT: retq120;121; X32-LABEL: add_zext_cmp_mask_narrower_result:122; X32: # %bb.0:123; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax124; X32-NEXT: andb $1, %al125; X32-NEXT: xorb $43, %al126; X32-NEXT: retl127 %a = and i32 %x, 1128 %c = icmp eq i32 %a, 0129 %z = zext i1 %c to i8130 %r = add i8 %z, 42131 ret i8 %r132}133 134define i32 @low_bit_select_constants_bigger_false_same_size_result(i32 %x) {135; X64-LABEL: low_bit_select_constants_bigger_false_same_size_result:136; X64: # %bb.0:137; X64-NEXT: # kill: def $edi killed $edi def $rdi138; X64-NEXT: andl $1, %edi139; X64-NEXT: leal 42(%rdi), %eax140; X64-NEXT: retq141;142; X32-LABEL: low_bit_select_constants_bigger_false_same_size_result:143; X32: # %bb.0:144; X32-NEXT: movl {{[0-9]+}}(%esp), %eax145; X32-NEXT: andl $1, %eax146; X32-NEXT: orl $42, %eax147; X32-NEXT: retl148 %a = and i32 %x, 1149 %c = icmp eq i32 %a, 0150 %r = select i1 %c, i32 42, i32 43151 ret i32 %r152}153 154define i64 @low_bit_select_constants_bigger_false_wider_result(i32 %x) {155; X64-LABEL: low_bit_select_constants_bigger_false_wider_result:156; X64: # %bb.0:157; X64-NEXT: # kill: def $edi killed $edi def $rdi158; X64-NEXT: andl $1, %edi159; X64-NEXT: leaq 26(%rdi), %rax160; X64-NEXT: retq161;162; X32-LABEL: low_bit_select_constants_bigger_false_wider_result:163; X32: # %bb.0:164; X32-NEXT: movl {{[0-9]+}}(%esp), %eax165; X32-NEXT: andl $1, %eax166; X32-NEXT: orl $26, %eax167; X32-NEXT: xorl %edx, %edx168; X32-NEXT: retl169 %a = and i32 %x, 1170 %c = icmp eq i32 %a, 0171 %r = select i1 %c, i64 26, i64 27172 ret i64 %r173}174 175define i16 @low_bit_select_constants_bigger_false_narrower_result(i32 %x) {176; X64-LABEL: low_bit_select_constants_bigger_false_narrower_result:177; X64: # %bb.0:178; X64-NEXT: # kill: def $edi killed $edi def $rdi179; X64-NEXT: andl $1, %edi180; X64-NEXT: leal 36(%rdi), %eax181; X64-NEXT: # kill: def $ax killed $ax killed $eax182; X64-NEXT: retq183;184; X32-LABEL: low_bit_select_constants_bigger_false_narrower_result:185; X32: # %bb.0:186; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax187; X32-NEXT: andl $1, %eax188; X32-NEXT: orl $36, %eax189; X32-NEXT: # kill: def $ax killed $ax killed $eax190; X32-NEXT: retl191 %a = and i32 %x, 1192 %c = icmp eq i32 %a, 0193 %r = select i1 %c, i16 36, i16 37194 ret i16 %r195}196 197define i8 @low_bit_select_constants_bigger_true_same_size_result(i8 %x) {198; X64-LABEL: low_bit_select_constants_bigger_true_same_size_result:199; X64: # %bb.0:200; X64-NEXT: movl %edi, %eax201; X64-NEXT: andb $1, %al202; X64-NEXT: xorb $-29, %al203; X64-NEXT: # kill: def $al killed $al killed $eax204; X64-NEXT: retq205;206; X32-LABEL: low_bit_select_constants_bigger_true_same_size_result:207; X32: # %bb.0:208; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax209; X32-NEXT: andb $1, %al210; X32-NEXT: xorb $-29, %al211; X32-NEXT: retl212 %a = and i8 %x, 1213 %c = icmp eq i8 %a, 0214 %r = select i1 %c, i8 227, i8 226215 ret i8 %r216}217 218define i32 @low_bit_select_constants_bigger_true_wider_result(i8 %x) {219; X64-LABEL: low_bit_select_constants_bigger_true_wider_result:220; X64: # %bb.0:221; X64-NEXT: movl %edi, %eax222; X64-NEXT: andl $1, %eax223; X64-NEXT: xorl $227, %eax224; X64-NEXT: retq225;226; X32-LABEL: low_bit_select_constants_bigger_true_wider_result:227; X32: # %bb.0:228; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax229; X32-NEXT: andl $1, %eax230; X32-NEXT: xorl $227, %eax231; X32-NEXT: retl232 %a = and i8 %x, 1233 %c = icmp eq i8 %a, 0234 %r = select i1 %c, i32 227, i32 226235 ret i32 %r236}237 238define i8 @low_bit_select_constants_bigger_true_narrower_result(i16 %x) {239; X64-LABEL: low_bit_select_constants_bigger_true_narrower_result:240; X64: # %bb.0:241; X64-NEXT: movl %edi, %eax242; X64-NEXT: andb $1, %al243; X64-NEXT: xorb $41, %al244; X64-NEXT: # kill: def $al killed $al killed $eax245; X64-NEXT: retq246;247; X32-LABEL: low_bit_select_constants_bigger_true_narrower_result:248; X32: # %bb.0:249; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax250; X32-NEXT: andb $1, %al251; X32-NEXT: xorb $41, %al252; X32-NEXT: retl253 %a = and i16 %x, 1254 %c = icmp eq i16 %a, 0255 %r = select i1 %c, i8 41, i8 40256 ret i8 %r257}258 259; Truncation hoisting must not occur with opaque constants260; because that can induce infinite looping.261 262define i1 @opaque_constant(i48 %x, i48 %y) {263; X64-LABEL: opaque_constant:264; X64: # %bb.0:265; X64-NEXT: movq %rdi, %rax266; X64-NEXT: xorq %rsi, %rax267; X64-NEXT: shrq $32, %rax268; X64-NEXT: andl $1, %eax269; X64-NEXT: # kill: def $al killed $al killed $rax270; X64-NEXT: retq271;272; X32-LABEL: opaque_constant:273; X32: # %bb.0:274; X32-NEXT: movl {{[0-9]+}}(%esp), %eax275; X32-NEXT: xorl {{[0-9]+}}(%esp), %eax276; X32-NEXT: andl $1, %eax277; X32-NEXT: # kill: def $al killed $al killed $eax278; X32-NEXT: retl279 %andx = and i48 %x, 4294967296280 %andy = and i48 %y, 4294967296281 %cmp1 = icmp ne i48 %andx, 0282 %cmp2 = icmp ne i48 %andy, 0283 %r = xor i1 %cmp1, %cmp2284 ret i1 %r285}286 287