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: andl $1, %edi 36; CHECK-NEXT: orb $46, %dil 37; CHECK-NEXT: movl %edi, %eax 38; CHECK-NEXT: retq 39 %a = and i32 %x, 1 40 %c = icmp eq i32 %a, 0 41 %z = zext i1 %c to i8 42 %r = sub i8 47, %z 43 ret i8 %r 44} 45 46define i8 @add_zext_cmp_mask_same_size_result(i8 %x) { 47; CHECK-LABEL: add_zext_cmp_mask_same_size_result: 48; CHECK: # %bb.0: 49; CHECK-NEXT: andb $1, %dil 50; CHECK-NEXT: xorb $27, %dil 51; CHECK-NEXT: movl %edi, %eax 52; CHECK-NEXT: retq 53 %a = and i8 %x, 1 54 %c = icmp eq i8 %a, 0 55 %z = zext i1 %c to i8 56 %r = add i8 %z, 26 57 ret i8 %r 58} 59 60define i32 @add_zext_cmp_mask_wider_result(i8 %x) { 61; CHECK-LABEL: add_zext_cmp_mask_wider_result: 62; CHECK: # %bb.0: 63; CHECK-NEXT: andl $1, %edi 64; CHECK-NEXT: xorl $27, %edi 65; CHECK-NEXT: movl %edi, %eax 66; CHECK-NEXT: retq 67 %a = and i8 %x, 1 68 %c = icmp eq i8 %a, 0 69 %z = zext i1 %c to i32 70 %r = add i32 %z, 26 71 ret i32 %r 72} 73 74define i8 @add_zext_cmp_mask_narrower_result(i32 %x) { 75; CHECK-LABEL: add_zext_cmp_mask_narrower_result: 76; CHECK: # %bb.0: 77; CHECK-NEXT: andl $1, %edi 78; CHECK-NEXT: xorb $43, %dil 79; CHECK-NEXT: movl %edi, %eax 80; CHECK-NEXT: retq 81 %a = and i32 %x, 1 82 %c = icmp eq i32 %a, 0 83 %z = zext i1 %c to i8 84 %r = add i8 %z, 42 85 ret i8 %r 86} 87 88define i32 @low_bit_select_constants_bigger_false_same_size_result(i32 %x) { 89; CHECK-LABEL: low_bit_select_constants_bigger_false_same_size_result: 90; CHECK: # %bb.0: 91; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 92; CHECK-NEXT: andl $1, %edi 93; CHECK-NEXT: leal 42(%rdi), %eax 94; CHECK-NEXT: retq 95 %a = and i32 %x, 1 96 %c = icmp eq i32 %a, 0 97 %r = select i1 %c, i32 42, i32 43 98 ret i32 %r 99} 100 101define i64 @low_bit_select_constants_bigger_false_wider_result(i32 %x) { 102; CHECK-LABEL: low_bit_select_constants_bigger_false_wider_result: 103; CHECK: # %bb.0: 104; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 105; CHECK-NEXT: andl $1, %edi 106; CHECK-NEXT: leaq 26(%rdi), %rax 107; CHECK-NEXT: retq 108 %a = and i32 %x, 1 109 %c = icmp eq i32 %a, 0 110 %r = select i1 %c, i64 26, i64 27 111 ret i64 %r 112} 113 114define i16 @low_bit_select_constants_bigger_false_narrower_result(i32 %x) { 115; CHECK-LABEL: low_bit_select_constants_bigger_false_narrower_result: 116; CHECK: # %bb.0: 117; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 118; CHECK-NEXT: andl $1, %edi 119; CHECK-NEXT: leal 36(%rdi), %eax 120; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 121; CHECK-NEXT: retq 122 %a = and i32 %x, 1 123 %c = icmp eq i32 %a, 0 124 %r = select i1 %c, i16 36, i16 37 125 ret i16 %r 126} 127 128define i8 @low_bit_select_constants_bigger_true_same_size_result(i8 %x) { 129; CHECK-LABEL: low_bit_select_constants_bigger_true_same_size_result: 130; CHECK: # %bb.0: 131; CHECK-NEXT: andb $1, %dil 132; CHECK-NEXT: xorb $-29, %dil 133; CHECK-NEXT: movl %edi, %eax 134; CHECK-NEXT: retq 135 %a = and i8 %x, 1 136 %c = icmp eq i8 %a, 0 137 %r = select i1 %c, i8 227, i8 226 138 ret i8 %r 139} 140 141define i32 @low_bit_select_constants_bigger_true_wider_result(i8 %x) { 142; CHECK-LABEL: low_bit_select_constants_bigger_true_wider_result: 143; CHECK: # %bb.0: 144; CHECK-NEXT: andl $1, %edi 145; CHECK-NEXT: xorl $227, %edi 146; CHECK-NEXT: movl %edi, %eax 147; CHECK-NEXT: retq 148 %a = and i8 %x, 1 149 %c = icmp eq i8 %a, 0 150 %r = select i1 %c, i32 227, i32 226 151 ret i32 %r 152} 153 154define i8 @low_bit_select_constants_bigger_true_narrower_result(i16 %x) { 155; CHECK-LABEL: low_bit_select_constants_bigger_true_narrower_result: 156; CHECK: # %bb.0: 157; CHECK-NEXT: andl $1, %edi 158; CHECK-NEXT: xorb $41, %dil 159; CHECK-NEXT: movl %edi, %eax 160; CHECK-NEXT: retq 161 %a = and i16 %x, 1 162 %c = icmp eq i16 %a, 0 163 %r = select i1 %c, i8 41, i8 40 164 ret i8 %r 165} 166 167