1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s 3 4define i32 @sub_zext_cmp_mask_same_size_result(i32 %x) { 5; CHECK-LABEL: sub_zext_cmp_mask_same_size_result: 6; CHECK: # %bb.0: 7; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 8; CHECK-NEXT: andl $1, %edi 9; CHECK-NEXT: leal -28(%rdi), %eax 10; CHECK-NEXT: retq 11 %a = and i32 %x, 1 12 %c = icmp eq i32 %a, 0 13 %z = zext i1 %c to i32 14 %r = sub i32 -27, %z 15 ret i32 %r 16} 17 18define i32 @sub_zext_cmp_mask_wider_result(i8 %x) { 19; CHECK-LABEL: sub_zext_cmp_mask_wider_result: 20; CHECK: # %bb.0: 21; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 22; CHECK-NEXT: andl $1, %edi 23; CHECK-NEXT: leal 26(%rdi), %eax 24; CHECK-NEXT: retq 25 %a = and i8 %x, 1 26 %c = icmp eq i8 %a, 0 27 %z = zext i1 %c to i32 28 %r = sub i32 27, %z 29 ret i32 %r 30} 31 32define i8 @sub_zext_cmp_mask_narrower_result(i32 %x) { 33; CHECK-LABEL: sub_zext_cmp_mask_narrower_result: 34; CHECK: # %bb.0: 35; CHECK-NEXT: movl %edi, %eax 36; CHECK-NEXT: andb $1, %al 37; CHECK-NEXT: orb $46, %al 38; CHECK-NEXT: # kill: def $al killed $al killed $eax 39; CHECK-NEXT: retq 40 %a = and i32 %x, 1 41 %c = icmp eq i32 %a, 0 42 %z = zext i1 %c to i8 43 %r = sub i8 47, %z 44 ret i8 %r 45} 46 47define i8 @add_zext_cmp_mask_same_size_result(i8 %x) { 48; CHECK-LABEL: add_zext_cmp_mask_same_size_result: 49; CHECK: # %bb.0: 50; CHECK-NEXT: movl %edi, %eax 51; CHECK-NEXT: andb $1, %al 52; CHECK-NEXT: xorb $27, %al 53; CHECK-NEXT: # kill: def $al killed $al killed $eax 54; CHECK-NEXT: retq 55 %a = and i8 %x, 1 56 %c = icmp eq i8 %a, 0 57 %z = zext i1 %c to i8 58 %r = add i8 %z, 26 59 ret i8 %r 60} 61 62define i32 @add_zext_cmp_mask_wider_result(i8 %x) { 63; CHECK-LABEL: add_zext_cmp_mask_wider_result: 64; CHECK: # %bb.0: 65; CHECK-NEXT: movl %edi, %eax 66; CHECK-NEXT: andl $1, %eax 67; CHECK-NEXT: xorl $27, %eax 68; CHECK-NEXT: retq 69 %a = and i8 %x, 1 70 %c = icmp eq i8 %a, 0 71 %z = zext i1 %c to i32 72 %r = add i32 %z, 26 73 ret i32 %r 74} 75 76define i8 @add_zext_cmp_mask_narrower_result(i32 %x) { 77; CHECK-LABEL: add_zext_cmp_mask_narrower_result: 78; CHECK: # %bb.0: 79; CHECK-NEXT: movl %edi, %eax 80; CHECK-NEXT: andb $1, %al 81; CHECK-NEXT: xorb $43, %al 82; CHECK-NEXT: # kill: def $al killed $al killed $eax 83; CHECK-NEXT: retq 84 %a = and i32 %x, 1 85 %c = icmp eq i32 %a, 0 86 %z = zext i1 %c to i8 87 %r = add i8 %z, 42 88 ret i8 %r 89} 90 91define i32 @low_bit_select_constants_bigger_false_same_size_result(i32 %x) { 92; CHECK-LABEL: low_bit_select_constants_bigger_false_same_size_result: 93; CHECK: # %bb.0: 94; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 95; CHECK-NEXT: andl $1, %edi 96; CHECK-NEXT: leal 42(%rdi), %eax 97; CHECK-NEXT: retq 98 %a = and i32 %x, 1 99 %c = icmp eq i32 %a, 0 100 %r = select i1 %c, i32 42, i32 43 101 ret i32 %r 102} 103 104define i64 @low_bit_select_constants_bigger_false_wider_result(i32 %x) { 105; CHECK-LABEL: low_bit_select_constants_bigger_false_wider_result: 106; CHECK: # %bb.0: 107; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 108; CHECK-NEXT: andl $1, %edi 109; CHECK-NEXT: leaq 26(%rdi), %rax 110; CHECK-NEXT: retq 111 %a = and i32 %x, 1 112 %c = icmp eq i32 %a, 0 113 %r = select i1 %c, i64 26, i64 27 114 ret i64 %r 115} 116 117define i16 @low_bit_select_constants_bigger_false_narrower_result(i32 %x) { 118; CHECK-LABEL: low_bit_select_constants_bigger_false_narrower_result: 119; CHECK: # %bb.0: 120; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 121; CHECK-NEXT: andl $1, %edi 122; CHECK-NEXT: leal 36(%rdi), %eax 123; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 124; CHECK-NEXT: retq 125 %a = and i32 %x, 1 126 %c = icmp eq i32 %a, 0 127 %r = select i1 %c, i16 36, i16 37 128 ret i16 %r 129} 130 131define i8 @low_bit_select_constants_bigger_true_same_size_result(i8 %x) { 132; CHECK-LABEL: low_bit_select_constants_bigger_true_same_size_result: 133; CHECK: # %bb.0: 134; CHECK-NEXT: movl %edi, %eax 135; CHECK-NEXT: andb $1, %al 136; CHECK-NEXT: xorb $-29, %al 137; CHECK-NEXT: # kill: def $al killed $al killed $eax 138; CHECK-NEXT: retq 139 %a = and i8 %x, 1 140 %c = icmp eq i8 %a, 0 141 %r = select i1 %c, i8 227, i8 226 142 ret i8 %r 143} 144 145define i32 @low_bit_select_constants_bigger_true_wider_result(i8 %x) { 146; CHECK-LABEL: low_bit_select_constants_bigger_true_wider_result: 147; CHECK: # %bb.0: 148; CHECK-NEXT: movl %edi, %eax 149; CHECK-NEXT: andl $1, %eax 150; CHECK-NEXT: xorl $227, %eax 151; CHECK-NEXT: retq 152 %a = and i8 %x, 1 153 %c = icmp eq i8 %a, 0 154 %r = select i1 %c, i32 227, i32 226 155 ret i32 %r 156} 157 158define i8 @low_bit_select_constants_bigger_true_narrower_result(i16 %x) { 159; CHECK-LABEL: low_bit_select_constants_bigger_true_narrower_result: 160; CHECK: # %bb.0: 161; CHECK-NEXT: movl %edi, %eax 162; CHECK-NEXT: andb $1, %al 163; CHECK-NEXT: xorb $41, %al 164; CHECK-NEXT: # kill: def $al killed $al killed $eax 165; CHECK-NEXT: retq 166 %a = and i16 %x, 1 167 %c = icmp eq i16 %a, 0 168 %r = select i1 %c, i8 41, i8 40 169 ret i8 %r 170} 171 172