1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2 ; RUN: opt < %s -instcombine -data-layout="n8:16:32" -S | FileCheck %s 3 ; RUN: opt < %s -instcombine -data-layout="n16" -S | FileCheck %s 4 5 ; PR35792 - https://bugs.llvm.org/show_bug.cgi?id=35792 6 7 define i16 @zext_add(i8 %x) { 8 ; CHECK-LABEL: @zext_add( 9 ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], 44 10 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X]] 11 ; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP2]] to i16 12 ; CHECK-NEXT: ret i16 [[R]] 13 ; 14 %z = zext i8 %x to i16 15 %b = add i16 %z, 44 16 %r = and i16 %b, %z 17 ret i16 %r 18 } 19 20 define i16 @zext_sub(i8 %x) { 21 ; CHECK-LABEL: @zext_sub( 22 ; CHECK-NEXT: [[TMP1:%.*]] = sub i8 -5, [[X:%.*]] 23 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X]] 24 ; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP2]] to i16 25 ; CHECK-NEXT: ret i16 [[R]] 26 ; 27 %z = zext i8 %x to i16 28 %b = sub i16 -5, %z 29 %r = and i16 %b, %z 30 ret i16 %r 31 } 32 33 define i16 @zext_mul(i8 %x) { 34 ; CHECK-LABEL: @zext_mul( 35 ; CHECK-NEXT: [[TMP1:%.*]] = mul i8 [[X:%.*]], 3 36 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X]] 37 ; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP2]] to i16 38 ; CHECK-NEXT: ret i16 [[R]] 39 ; 40 %z = zext i8 %x to i16 41 %b = mul i16 %z, 3 42 %r = and i16 %b, %z 43 ret i16 %r 44 } 45 46 define i16 @zext_lshr(i8 %x) { 47 ; CHECK-LABEL: @zext_lshr( 48 ; CHECK-NEXT: [[TMP1:%.*]] = lshr i8 [[X:%.*]], 4 49 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X]] 50 ; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP2]] to i16 51 ; CHECK-NEXT: ret i16 [[R]] 52 ; 53 %z = zext i8 %x to i16 54 %b = lshr i16 %z, 4 55 %r = and i16 %b, %z 56 ret i16 %r 57 } 58 59 define i16 @zext_ashr(i8 %x) { 60 ; CHECK-LABEL: @zext_ashr( 61 ; CHECK-NEXT: [[TMP1:%.*]] = lshr i8 [[X:%.*]], 2 62 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X]] 63 ; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP2]] to i16 64 ; CHECK-NEXT: ret i16 [[R]] 65 ; 66 %z = zext i8 %x to i16 67 %b = ashr i16 %z, 2 68 %r = and i16 %b, %z 69 ret i16 %r 70 } 71 72 define i16 @zext_shl(i8 %x) { 73 ; CHECK-LABEL: @zext_shl( 74 ; CHECK-NEXT: [[TMP1:%.*]] = shl i8 [[X:%.*]], 3 75 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X]] 76 ; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP2]] to i16 77 ; CHECK-NEXT: ret i16 [[R]] 78 ; 79 %z = zext i8 %x to i16 80 %b = shl i16 %z, 3 81 %r = and i16 %b, %z 82 ret i16 %r 83 } 84 85 define <2 x i16> @zext_add_vec(<2 x i8> %x) { 86 ; CHECK-LABEL: @zext_add_vec( 87 ; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i8> [[X:%.*]], <i8 44, i8 42> 88 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], [[X]] 89 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i16> 90 ; CHECK-NEXT: ret <2 x i16> [[R]] 91 ; 92 %z = zext <2 x i8> %x to <2 x i16> 93 %b = add <2 x i16> %z, <i16 44, i16 42> 94 %r = and <2 x i16> %b, %z 95 ret <2 x i16> %r 96 } 97 98 define <2 x i16> @zext_sub_vec(<2 x i8> %x) { 99 ; CHECK-LABEL: @zext_sub_vec( 100 ; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i8> <i8 -5, i8 -4>, [[X:%.*]] 101 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], [[X]] 102 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i16> 103 ; CHECK-NEXT: ret <2 x i16> [[R]] 104 ; 105 %z = zext <2 x i8> %x to <2 x i16> 106 %b = sub <2 x i16> <i16 -5, i16 -4>, %z 107 %r = and <2 x i16> %b, %z 108 ret <2 x i16> %r 109 } 110 111 define <2 x i16> @zext_mul_vec(<2 x i8> %x) { 112 ; CHECK-LABEL: @zext_mul_vec( 113 ; CHECK-NEXT: [[TMP1:%.*]] = mul <2 x i8> [[X:%.*]], <i8 3, i8 -2> 114 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], [[X]] 115 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i16> 116 ; CHECK-NEXT: ret <2 x i16> [[R]] 117 ; 118 %z = zext <2 x i8> %x to <2 x i16> 119 %b = mul <2 x i16> %z, <i16 3, i16 -2> 120 %r = and <2 x i16> %b, %z 121 ret <2 x i16> %r 122 } 123 124 define <2 x i16> @zext_lshr_vec(<2 x i8> %x) { 125 ; CHECK-LABEL: @zext_lshr_vec( 126 ; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i8> [[X:%.*]], <i8 4, i8 2> 127 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], [[X]] 128 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i16> 129 ; CHECK-NEXT: ret <2 x i16> [[R]] 130 ; 131 %z = zext <2 x i8> %x to <2 x i16> 132 %b = lshr <2 x i16> %z, <i16 4, i16 2> 133 %r = and <2 x i16> %b, %z 134 ret <2 x i16> %r 135 } 136 137 define <2 x i16> @zext_ashr_vec(<2 x i8> %x) { 138 ; CHECK-LABEL: @zext_ashr_vec( 139 ; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i8> [[X:%.*]], <i8 2, i8 3> 140 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], [[X]] 141 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i16> 142 ; CHECK-NEXT: ret <2 x i16> [[R]] 143 ; 144 %z = zext <2 x i8> %x to <2 x i16> 145 %b = ashr <2 x i16> %z, <i16 2, i16 3> 146 %r = and <2 x i16> %b, %z 147 ret <2 x i16> %r 148 } 149 150 define <2 x i16> @zext_shl_vec(<2 x i8> %x) { 151 ; CHECK-LABEL: @zext_shl_vec( 152 ; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i8> [[X:%.*]], <i8 3, i8 2> 153 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], [[X]] 154 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i16> 155 ; CHECK-NEXT: ret <2 x i16> [[R]] 156 ; 157 %z = zext <2 x i8> %x to <2 x i16> 158 %b = shl <2 x i16> %z, <i16 3, i16 2> 159 %r = and <2 x i16> %b, %z 160 ret <2 x i16> %r 161 } 162 163 ; Don't create poison by narrowing a shift below the shift amount. 164 165 define <2 x i16> @zext_lshr_vec_overshift(<2 x i8> %x) { 166 ; CHECK-LABEL: @zext_lshr_vec_overshift( 167 ; CHECK-NEXT: [[Z:%.*]] = zext <2 x i8> [[X:%.*]] to <2 x i16> 168 ; CHECK-NEXT: [[B:%.*]] = lshr <2 x i16> [[Z]], <i16 4, i16 8> 169 ; CHECK-NEXT: [[R:%.*]] = and <2 x i16> [[B]], [[Z]] 170 ; CHECK-NEXT: ret <2 x i16> [[R]] 171 ; 172 %z = zext <2 x i8> %x to <2 x i16> 173 %b = lshr <2 x i16> %z, <i16 4, i16 8> 174 %r = and <2 x i16> %b, %z 175 ret <2 x i16> %r 176 } 177 178 ; Don't create poison by narrowing a shift below the shift amount. 179 180 define <2 x i16> @zext_shl_vec_overshift(<2 x i8> %x) { 181 ; CHECK-LABEL: @zext_shl_vec_overshift( 182 ; CHECK-NEXT: [[Z:%.*]] = zext <2 x i8> [[X:%.*]] to <2 x i16> 183 ; CHECK-NEXT: [[B:%.*]] = shl <2 x i16> [[Z]], <i16 8, i16 2> 184 ; CHECK-NEXT: [[R:%.*]] = and <2 x i16> [[B]], [[Z]] 185 ; CHECK-NEXT: ret <2 x i16> [[R]] 186 ; 187 %z = zext <2 x i8> %x to <2 x i16> 188 %b = shl <2 x i16> %z, <i16 8, i16 2> 189 %r = and <2 x i16> %b, %z 190 ret <2 x i16> %r 191 } 192 193