1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s 3 4 define 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 18 define 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 32 define 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 46 define 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 60 define 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 74 define 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 88 define 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 101 define 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 114 define 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 128 define 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 141 define 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 154 define 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