1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -mtriple=x86_64-unknown -basic-aa -slp-vectorizer -S | FileCheck %s --check-prefixes=SSE,SSE2 3; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=slm -basic-aa -slp-vectorizer -S | FileCheck %s --check-prefixes=SSE,SLM 4; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=corei7-avx -basic-aa -slp-vectorizer -S | FileCheck %s --check-prefixes=AVX 5; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=core-avx2 -basic-aa -slp-vectorizer -S | FileCheck %s --check-prefixes=AVX 6; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=knl -basic-aa -slp-vectorizer -S | FileCheck %s --check-prefixes=AVX 7; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=skx -mattr=+avx512bw -basic-aa -slp-vectorizer -S | FileCheck %s --check-prefixes=AVX 8 9; 10; vXi8 11; 12 13define <2 x i64> @loadext_2i8_to_2i64(i8* %p0) { 14; SSE2-LABEL: @loadext_2i8_to_2i64( 15; SSE2-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 16; SSE2-NEXT: [[I0:%.*]] = load i8, i8* [[P0]], align 1 17; SSE2-NEXT: [[I1:%.*]] = load i8, i8* [[P1]], align 1 18; SSE2-NEXT: [[X0:%.*]] = sext i8 [[I0]] to i64 19; SSE2-NEXT: [[X1:%.*]] = sext i8 [[I1]] to i64 20; SSE2-NEXT: [[V0:%.*]] = insertelement <2 x i64> undef, i64 [[X0]], i32 0 21; SSE2-NEXT: [[V1:%.*]] = insertelement <2 x i64> [[V0]], i64 [[X1]], i32 1 22; SSE2-NEXT: ret <2 x i64> [[V1]] 23; 24; SLM-LABEL: @loadext_2i8_to_2i64( 25; SLM-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 26; SLM-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <2 x i8>* 27; SLM-NEXT: [[TMP2:%.*]] = load <2 x i8>, <2 x i8>* [[TMP1]], align 1 28; SLM-NEXT: [[TMP3:%.*]] = sext <2 x i8> [[TMP2]] to <2 x i64> 29; SLM-NEXT: ret <2 x i64> [[TMP3]] 30; 31; AVX-LABEL: @loadext_2i8_to_2i64( 32; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 33; AVX-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <2 x i8>* 34; AVX-NEXT: [[TMP2:%.*]] = load <2 x i8>, <2 x i8>* [[TMP1]], align 1 35; AVX-NEXT: [[TMP3:%.*]] = sext <2 x i8> [[TMP2]] to <2 x i64> 36; AVX-NEXT: ret <2 x i64> [[TMP3]] 37; 38 %p1 = getelementptr inbounds i8, i8* %p0, i64 1 39 %i0 = load i8, i8* %p0, align 1 40 %i1 = load i8, i8* %p1, align 1 41 %x0 = sext i8 %i0 to i64 42 %x1 = sext i8 %i1 to i64 43 %v0 = insertelement <2 x i64> undef, i64 %x0, i32 0 44 %v1 = insertelement <2 x i64> %v0, i64 %x1, i32 1 45 ret <2 x i64> %v1 46} 47 48define <4 x i32> @loadext_4i8_to_4i32(i8* %p0) { 49; SSE-LABEL: @loadext_4i8_to_4i32( 50; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 51; SSE-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 52; SSE-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 53; SSE-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <4 x i8>* 54; SSE-NEXT: [[TMP2:%.*]] = load <4 x i8>, <4 x i8>* [[TMP1]], align 1 55; SSE-NEXT: [[TMP3:%.*]] = sext <4 x i8> [[TMP2]] to <4 x i32> 56; SSE-NEXT: ret <4 x i32> [[TMP3]] 57; 58; AVX-LABEL: @loadext_4i8_to_4i32( 59; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 60; AVX-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 61; AVX-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 62; AVX-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <4 x i8>* 63; AVX-NEXT: [[TMP2:%.*]] = load <4 x i8>, <4 x i8>* [[TMP1]], align 1 64; AVX-NEXT: [[TMP3:%.*]] = sext <4 x i8> [[TMP2]] to <4 x i32> 65; AVX-NEXT: ret <4 x i32> [[TMP3]] 66; 67 %p1 = getelementptr inbounds i8, i8* %p0, i64 1 68 %p2 = getelementptr inbounds i8, i8* %p0, i64 2 69 %p3 = getelementptr inbounds i8, i8* %p0, i64 3 70 %i0 = load i8, i8* %p0, align 1 71 %i1 = load i8, i8* %p1, align 1 72 %i2 = load i8, i8* %p2, align 1 73 %i3 = load i8, i8* %p3, align 1 74 %x0 = sext i8 %i0 to i32 75 %x1 = sext i8 %i1 to i32 76 %x2 = sext i8 %i2 to i32 77 %x3 = sext i8 %i3 to i32 78 %v0 = insertelement <4 x i32> undef, i32 %x0, i32 0 79 %v1 = insertelement <4 x i32> %v0, i32 %x1, i32 1 80 %v2 = insertelement <4 x i32> %v1, i32 %x2, i32 2 81 %v3 = insertelement <4 x i32> %v2, i32 %x3, i32 3 82 ret <4 x i32> %v3 83} 84 85define <4 x i64> @loadext_4i8_to_4i64(i8* %p0) { 86; SSE-LABEL: @loadext_4i8_to_4i64( 87; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 88; SSE-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 89; SSE-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 90; SSE-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <4 x i8>* 91; SSE-NEXT: [[TMP2:%.*]] = load <4 x i8>, <4 x i8>* [[TMP1]], align 1 92; SSE-NEXT: [[TMP3:%.*]] = sext <4 x i8> [[TMP2]] to <4 x i64> 93; SSE-NEXT: ret <4 x i64> [[TMP3]] 94; 95; AVX-LABEL: @loadext_4i8_to_4i64( 96; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 97; AVX-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 98; AVX-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 99; AVX-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <4 x i8>* 100; AVX-NEXT: [[TMP2:%.*]] = load <4 x i8>, <4 x i8>* [[TMP1]], align 1 101; AVX-NEXT: [[TMP3:%.*]] = sext <4 x i8> [[TMP2]] to <4 x i64> 102; AVX-NEXT: ret <4 x i64> [[TMP3]] 103; 104 %p1 = getelementptr inbounds i8, i8* %p0, i64 1 105 %p2 = getelementptr inbounds i8, i8* %p0, i64 2 106 %p3 = getelementptr inbounds i8, i8* %p0, i64 3 107 %i0 = load i8, i8* %p0, align 1 108 %i1 = load i8, i8* %p1, align 1 109 %i2 = load i8, i8* %p2, align 1 110 %i3 = load i8, i8* %p3, align 1 111 %x0 = sext i8 %i0 to i64 112 %x1 = sext i8 %i1 to i64 113 %x2 = sext i8 %i2 to i64 114 %x3 = sext i8 %i3 to i64 115 %v0 = insertelement <4 x i64> undef, i64 %x0, i32 0 116 %v1 = insertelement <4 x i64> %v0, i64 %x1, i32 1 117 %v2 = insertelement <4 x i64> %v1, i64 %x2, i32 2 118 %v3 = insertelement <4 x i64> %v2, i64 %x3, i32 3 119 ret <4 x i64> %v3 120} 121 122define <8 x i16> @loadext_8i8_to_8i16(i8* %p0) { 123; SSE-LABEL: @loadext_8i8_to_8i16( 124; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 125; SSE-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 126; SSE-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 127; SSE-NEXT: [[P4:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 4 128; SSE-NEXT: [[P5:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 5 129; SSE-NEXT: [[P6:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 6 130; SSE-NEXT: [[P7:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 7 131; SSE-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <8 x i8>* 132; SSE-NEXT: [[TMP2:%.*]] = load <8 x i8>, <8 x i8>* [[TMP1]], align 1 133; SSE-NEXT: [[TMP3:%.*]] = sext <8 x i8> [[TMP2]] to <8 x i16> 134; SSE-NEXT: ret <8 x i16> [[TMP3]] 135; 136; AVX-LABEL: @loadext_8i8_to_8i16( 137; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 138; AVX-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 139; AVX-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 140; AVX-NEXT: [[P4:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 4 141; AVX-NEXT: [[P5:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 5 142; AVX-NEXT: [[P6:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 6 143; AVX-NEXT: [[P7:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 7 144; AVX-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <8 x i8>* 145; AVX-NEXT: [[TMP2:%.*]] = load <8 x i8>, <8 x i8>* [[TMP1]], align 1 146; AVX-NEXT: [[TMP3:%.*]] = sext <8 x i8> [[TMP2]] to <8 x i16> 147; AVX-NEXT: ret <8 x i16> [[TMP3]] 148; 149 %p1 = getelementptr inbounds i8, i8* %p0, i64 1 150 %p2 = getelementptr inbounds i8, i8* %p0, i64 2 151 %p3 = getelementptr inbounds i8, i8* %p0, i64 3 152 %p4 = getelementptr inbounds i8, i8* %p0, i64 4 153 %p5 = getelementptr inbounds i8, i8* %p0, i64 5 154 %p6 = getelementptr inbounds i8, i8* %p0, i64 6 155 %p7 = getelementptr inbounds i8, i8* %p0, i64 7 156 %i0 = load i8, i8* %p0, align 1 157 %i1 = load i8, i8* %p1, align 1 158 %i2 = load i8, i8* %p2, align 1 159 %i3 = load i8, i8* %p3, align 1 160 %i4 = load i8, i8* %p4, align 1 161 %i5 = load i8, i8* %p5, align 1 162 %i6 = load i8, i8* %p6, align 1 163 %i7 = load i8, i8* %p7, align 1 164 %x0 = sext i8 %i0 to i16 165 %x1 = sext i8 %i1 to i16 166 %x2 = sext i8 %i2 to i16 167 %x3 = sext i8 %i3 to i16 168 %x4 = sext i8 %i4 to i16 169 %x5 = sext i8 %i5 to i16 170 %x6 = sext i8 %i6 to i16 171 %x7 = sext i8 %i7 to i16 172 %v0 = insertelement <8 x i16> undef, i16 %x0, i32 0 173 %v1 = insertelement <8 x i16> %v0, i16 %x1, i32 1 174 %v2 = insertelement <8 x i16> %v1, i16 %x2, i32 2 175 %v3 = insertelement <8 x i16> %v2, i16 %x3, i32 3 176 %v4 = insertelement <8 x i16> %v3, i16 %x4, i32 4 177 %v5 = insertelement <8 x i16> %v4, i16 %x5, i32 5 178 %v6 = insertelement <8 x i16> %v5, i16 %x6, i32 6 179 %v7 = insertelement <8 x i16> %v6, i16 %x7, i32 7 180 ret <8 x i16> %v7 181} 182 183define <8 x i32> @loadext_8i8_to_8i32(i8* %p0) { 184; SSE-LABEL: @loadext_8i8_to_8i32( 185; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 186; SSE-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 187; SSE-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 188; SSE-NEXT: [[P4:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 4 189; SSE-NEXT: [[P5:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 5 190; SSE-NEXT: [[P6:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 6 191; SSE-NEXT: [[P7:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 7 192; SSE-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <8 x i8>* 193; SSE-NEXT: [[TMP2:%.*]] = load <8 x i8>, <8 x i8>* [[TMP1]], align 1 194; SSE-NEXT: [[TMP3:%.*]] = sext <8 x i8> [[TMP2]] to <8 x i32> 195; SSE-NEXT: ret <8 x i32> [[TMP3]] 196; 197; AVX-LABEL: @loadext_8i8_to_8i32( 198; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 199; AVX-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 200; AVX-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 201; AVX-NEXT: [[P4:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 4 202; AVX-NEXT: [[P5:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 5 203; AVX-NEXT: [[P6:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 6 204; AVX-NEXT: [[P7:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 7 205; AVX-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <8 x i8>* 206; AVX-NEXT: [[TMP2:%.*]] = load <8 x i8>, <8 x i8>* [[TMP1]], align 1 207; AVX-NEXT: [[TMP3:%.*]] = sext <8 x i8> [[TMP2]] to <8 x i32> 208; AVX-NEXT: ret <8 x i32> [[TMP3]] 209; 210 %p1 = getelementptr inbounds i8, i8* %p0, i64 1 211 %p2 = getelementptr inbounds i8, i8* %p0, i64 2 212 %p3 = getelementptr inbounds i8, i8* %p0, i64 3 213 %p4 = getelementptr inbounds i8, i8* %p0, i64 4 214 %p5 = getelementptr inbounds i8, i8* %p0, i64 5 215 %p6 = getelementptr inbounds i8, i8* %p0, i64 6 216 %p7 = getelementptr inbounds i8, i8* %p0, i64 7 217 %i0 = load i8, i8* %p0, align 1 218 %i1 = load i8, i8* %p1, align 1 219 %i2 = load i8, i8* %p2, align 1 220 %i3 = load i8, i8* %p3, align 1 221 %i4 = load i8, i8* %p4, align 1 222 %i5 = load i8, i8* %p5, align 1 223 %i6 = load i8, i8* %p6, align 1 224 %i7 = load i8, i8* %p7, align 1 225 %x0 = sext i8 %i0 to i32 226 %x1 = sext i8 %i1 to i32 227 %x2 = sext i8 %i2 to i32 228 %x3 = sext i8 %i3 to i32 229 %x4 = sext i8 %i4 to i32 230 %x5 = sext i8 %i5 to i32 231 %x6 = sext i8 %i6 to i32 232 %x7 = sext i8 %i7 to i32 233 %v0 = insertelement <8 x i32> undef, i32 %x0, i32 0 234 %v1 = insertelement <8 x i32> %v0, i32 %x1, i32 1 235 %v2 = insertelement <8 x i32> %v1, i32 %x2, i32 2 236 %v3 = insertelement <8 x i32> %v2, i32 %x3, i32 3 237 %v4 = insertelement <8 x i32> %v3, i32 %x4, i32 4 238 %v5 = insertelement <8 x i32> %v4, i32 %x5, i32 5 239 %v6 = insertelement <8 x i32> %v5, i32 %x6, i32 6 240 %v7 = insertelement <8 x i32> %v6, i32 %x7, i32 7 241 ret <8 x i32> %v7 242} 243 244define <16 x i16> @loadext_16i8_to_16i16(i8* %p0) { 245; SSE-LABEL: @loadext_16i8_to_16i16( 246; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 247; SSE-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 248; SSE-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 249; SSE-NEXT: [[P4:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 4 250; SSE-NEXT: [[P5:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 5 251; SSE-NEXT: [[P6:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 6 252; SSE-NEXT: [[P7:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 7 253; SSE-NEXT: [[P8:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 8 254; SSE-NEXT: [[P9:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 9 255; SSE-NEXT: [[P10:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 10 256; SSE-NEXT: [[P11:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 11 257; SSE-NEXT: [[P12:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 12 258; SSE-NEXT: [[P13:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 13 259; SSE-NEXT: [[P14:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 14 260; SSE-NEXT: [[P15:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 15 261; SSE-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <16 x i8>* 262; SSE-NEXT: [[TMP2:%.*]] = load <16 x i8>, <16 x i8>* [[TMP1]], align 1 263; SSE-NEXT: [[TMP3:%.*]] = sext <16 x i8> [[TMP2]] to <16 x i16> 264; SSE-NEXT: ret <16 x i16> [[TMP3]] 265; 266; AVX-LABEL: @loadext_16i8_to_16i16( 267; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i8, i8* [[P0:%.*]], i64 1 268; AVX-NEXT: [[P2:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 2 269; AVX-NEXT: [[P3:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 3 270; AVX-NEXT: [[P4:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 4 271; AVX-NEXT: [[P5:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 5 272; AVX-NEXT: [[P6:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 6 273; AVX-NEXT: [[P7:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 7 274; AVX-NEXT: [[P8:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 8 275; AVX-NEXT: [[P9:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 9 276; AVX-NEXT: [[P10:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 10 277; AVX-NEXT: [[P11:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 11 278; AVX-NEXT: [[P12:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 12 279; AVX-NEXT: [[P13:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 13 280; AVX-NEXT: [[P14:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 14 281; AVX-NEXT: [[P15:%.*]] = getelementptr inbounds i8, i8* [[P0]], i64 15 282; AVX-NEXT: [[TMP1:%.*]] = bitcast i8* [[P0]] to <16 x i8>* 283; AVX-NEXT: [[TMP2:%.*]] = load <16 x i8>, <16 x i8>* [[TMP1]], align 1 284; AVX-NEXT: [[TMP3:%.*]] = sext <16 x i8> [[TMP2]] to <16 x i16> 285; AVX-NEXT: ret <16 x i16> [[TMP3]] 286; 287 %p1 = getelementptr inbounds i8, i8* %p0, i64 1 288 %p2 = getelementptr inbounds i8, i8* %p0, i64 2 289 %p3 = getelementptr inbounds i8, i8* %p0, i64 3 290 %p4 = getelementptr inbounds i8, i8* %p0, i64 4 291 %p5 = getelementptr inbounds i8, i8* %p0, i64 5 292 %p6 = getelementptr inbounds i8, i8* %p0, i64 6 293 %p7 = getelementptr inbounds i8, i8* %p0, i64 7 294 %p8 = getelementptr inbounds i8, i8* %p0, i64 8 295 %p9 = getelementptr inbounds i8, i8* %p0, i64 9 296 %p10 = getelementptr inbounds i8, i8* %p0, i64 10 297 %p11 = getelementptr inbounds i8, i8* %p0, i64 11 298 %p12 = getelementptr inbounds i8, i8* %p0, i64 12 299 %p13 = getelementptr inbounds i8, i8* %p0, i64 13 300 %p14 = getelementptr inbounds i8, i8* %p0, i64 14 301 %p15 = getelementptr inbounds i8, i8* %p0, i64 15 302 %i0 = load i8, i8* %p0, align 1 303 %i1 = load i8, i8* %p1, align 1 304 %i2 = load i8, i8* %p2, align 1 305 %i3 = load i8, i8* %p3, align 1 306 %i4 = load i8, i8* %p4, align 1 307 %i5 = load i8, i8* %p5, align 1 308 %i6 = load i8, i8* %p6, align 1 309 %i7 = load i8, i8* %p7, align 1 310 %i8 = load i8, i8* %p8, align 1 311 %i9 = load i8, i8* %p9, align 1 312 %i10 = load i8, i8* %p10, align 1 313 %i11 = load i8, i8* %p11, align 1 314 %i12 = load i8, i8* %p12, align 1 315 %i13 = load i8, i8* %p13, align 1 316 %i14 = load i8, i8* %p14, align 1 317 %i15 = load i8, i8* %p15, align 1 318 %x0 = sext i8 %i0 to i16 319 %x1 = sext i8 %i1 to i16 320 %x2 = sext i8 %i2 to i16 321 %x3 = sext i8 %i3 to i16 322 %x4 = sext i8 %i4 to i16 323 %x5 = sext i8 %i5 to i16 324 %x6 = sext i8 %i6 to i16 325 %x7 = sext i8 %i7 to i16 326 %x8 = sext i8 %i8 to i16 327 %x9 = sext i8 %i9 to i16 328 %x10 = sext i8 %i10 to i16 329 %x11 = sext i8 %i11 to i16 330 %x12 = sext i8 %i12 to i16 331 %x13 = sext i8 %i13 to i16 332 %x14 = sext i8 %i14 to i16 333 %x15 = sext i8 %i15 to i16 334 %v0 = insertelement <16 x i16> undef, i16 %x0, i32 0 335 %v1 = insertelement <16 x i16> %v0, i16 %x1, i32 1 336 %v2 = insertelement <16 x i16> %v1, i16 %x2, i32 2 337 %v3 = insertelement <16 x i16> %v2, i16 %x3, i32 3 338 %v4 = insertelement <16 x i16> %v3, i16 %x4, i32 4 339 %v5 = insertelement <16 x i16> %v4, i16 %x5, i32 5 340 %v6 = insertelement <16 x i16> %v5, i16 %x6, i32 6 341 %v7 = insertelement <16 x i16> %v6, i16 %x7, i32 7 342 %v8 = insertelement <16 x i16> %v7, i16 %x8, i32 8 343 %v9 = insertelement <16 x i16> %v8, i16 %x9, i32 9 344 %v10 = insertelement <16 x i16> %v9, i16 %x10, i32 10 345 %v11 = insertelement <16 x i16> %v10, i16 %x11, i32 11 346 %v12 = insertelement <16 x i16> %v11, i16 %x12, i32 12 347 %v13 = insertelement <16 x i16> %v12, i16 %x13, i32 13 348 %v14 = insertelement <16 x i16> %v13, i16 %x14, i32 14 349 %v15 = insertelement <16 x i16> %v14, i16 %x15, i32 15 350 ret <16 x i16> %v15 351} 352 353; 354; vXi16 355; 356 357define <2 x i64> @loadext_2i16_to_2i64(i16* %p0) { 358; SSE-LABEL: @loadext_2i16_to_2i64( 359; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i16, i16* [[P0:%.*]], i64 1 360; SSE-NEXT: [[TMP1:%.*]] = bitcast i16* [[P0]] to <2 x i16>* 361; SSE-NEXT: [[TMP2:%.*]] = load <2 x i16>, <2 x i16>* [[TMP1]], align 1 362; SSE-NEXT: [[TMP3:%.*]] = sext <2 x i16> [[TMP2]] to <2 x i64> 363; SSE-NEXT: ret <2 x i64> [[TMP3]] 364; 365; AVX-LABEL: @loadext_2i16_to_2i64( 366; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i16, i16* [[P0:%.*]], i64 1 367; AVX-NEXT: [[TMP1:%.*]] = bitcast i16* [[P0]] to <2 x i16>* 368; AVX-NEXT: [[TMP2:%.*]] = load <2 x i16>, <2 x i16>* [[TMP1]], align 1 369; AVX-NEXT: [[TMP3:%.*]] = sext <2 x i16> [[TMP2]] to <2 x i64> 370; AVX-NEXT: ret <2 x i64> [[TMP3]] 371; 372 %p1 = getelementptr inbounds i16, i16* %p0, i64 1 373 %i0 = load i16, i16* %p0, align 1 374 %i1 = load i16, i16* %p1, align 1 375 %x0 = sext i16 %i0 to i64 376 %x1 = sext i16 %i1 to i64 377 %v0 = insertelement <2 x i64> undef, i64 %x0, i32 0 378 %v1 = insertelement <2 x i64> %v0, i64 %x1, i32 1 379 ret <2 x i64> %v1 380} 381 382define <4 x i32> @loadext_4i16_to_4i32(i16* %p0) { 383; SSE-LABEL: @loadext_4i16_to_4i32( 384; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i16, i16* [[P0:%.*]], i64 1 385; SSE-NEXT: [[P2:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 2 386; SSE-NEXT: [[P3:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 3 387; SSE-NEXT: [[TMP1:%.*]] = bitcast i16* [[P0]] to <4 x i16>* 388; SSE-NEXT: [[TMP2:%.*]] = load <4 x i16>, <4 x i16>* [[TMP1]], align 1 389; SSE-NEXT: [[TMP3:%.*]] = sext <4 x i16> [[TMP2]] to <4 x i32> 390; SSE-NEXT: ret <4 x i32> [[TMP3]] 391; 392; AVX-LABEL: @loadext_4i16_to_4i32( 393; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i16, i16* [[P0:%.*]], i64 1 394; AVX-NEXT: [[P2:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 2 395; AVX-NEXT: [[P3:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 3 396; AVX-NEXT: [[TMP1:%.*]] = bitcast i16* [[P0]] to <4 x i16>* 397; AVX-NEXT: [[TMP2:%.*]] = load <4 x i16>, <4 x i16>* [[TMP1]], align 1 398; AVX-NEXT: [[TMP3:%.*]] = sext <4 x i16> [[TMP2]] to <4 x i32> 399; AVX-NEXT: ret <4 x i32> [[TMP3]] 400; 401 %p1 = getelementptr inbounds i16, i16* %p0, i64 1 402 %p2 = getelementptr inbounds i16, i16* %p0, i64 2 403 %p3 = getelementptr inbounds i16, i16* %p0, i64 3 404 %i0 = load i16, i16* %p0, align 1 405 %i1 = load i16, i16* %p1, align 1 406 %i2 = load i16, i16* %p2, align 1 407 %i3 = load i16, i16* %p3, align 1 408 %x0 = sext i16 %i0 to i32 409 %x1 = sext i16 %i1 to i32 410 %x2 = sext i16 %i2 to i32 411 %x3 = sext i16 %i3 to i32 412 %v0 = insertelement <4 x i32> undef, i32 %x0, i32 0 413 %v1 = insertelement <4 x i32> %v0, i32 %x1, i32 1 414 %v2 = insertelement <4 x i32> %v1, i32 %x2, i32 2 415 %v3 = insertelement <4 x i32> %v2, i32 %x3, i32 3 416 ret <4 x i32> %v3 417} 418 419define <4 x i64> @loadext_4i16_to_4i64(i16* %p0) { 420; SSE-LABEL: @loadext_4i16_to_4i64( 421; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i16, i16* [[P0:%.*]], i64 1 422; SSE-NEXT: [[P2:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 2 423; SSE-NEXT: [[P3:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 3 424; SSE-NEXT: [[TMP1:%.*]] = bitcast i16* [[P0]] to <4 x i16>* 425; SSE-NEXT: [[TMP2:%.*]] = load <4 x i16>, <4 x i16>* [[TMP1]], align 1 426; SSE-NEXT: [[TMP3:%.*]] = sext <4 x i16> [[TMP2]] to <4 x i64> 427; SSE-NEXT: ret <4 x i64> [[TMP3]] 428; 429; AVX-LABEL: @loadext_4i16_to_4i64( 430; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i16, i16* [[P0:%.*]], i64 1 431; AVX-NEXT: [[P2:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 2 432; AVX-NEXT: [[P3:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 3 433; AVX-NEXT: [[TMP1:%.*]] = bitcast i16* [[P0]] to <4 x i16>* 434; AVX-NEXT: [[TMP2:%.*]] = load <4 x i16>, <4 x i16>* [[TMP1]], align 1 435; AVX-NEXT: [[TMP3:%.*]] = sext <4 x i16> [[TMP2]] to <4 x i64> 436; AVX-NEXT: ret <4 x i64> [[TMP3]] 437; 438 %p1 = getelementptr inbounds i16, i16* %p0, i64 1 439 %p2 = getelementptr inbounds i16, i16* %p0, i64 2 440 %p3 = getelementptr inbounds i16, i16* %p0, i64 3 441 %i0 = load i16, i16* %p0, align 1 442 %i1 = load i16, i16* %p1, align 1 443 %i2 = load i16, i16* %p2, align 1 444 %i3 = load i16, i16* %p3, align 1 445 %x0 = sext i16 %i0 to i64 446 %x1 = sext i16 %i1 to i64 447 %x2 = sext i16 %i2 to i64 448 %x3 = sext i16 %i3 to i64 449 %v0 = insertelement <4 x i64> undef, i64 %x0, i32 0 450 %v1 = insertelement <4 x i64> %v0, i64 %x1, i32 1 451 %v2 = insertelement <4 x i64> %v1, i64 %x2, i32 2 452 %v3 = insertelement <4 x i64> %v2, i64 %x3, i32 3 453 ret <4 x i64> %v3 454} 455 456define <8 x i32> @loadext_8i16_to_8i32(i16* %p0) { 457; SSE-LABEL: @loadext_8i16_to_8i32( 458; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i16, i16* [[P0:%.*]], i64 1 459; SSE-NEXT: [[P2:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 2 460; SSE-NEXT: [[P3:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 3 461; SSE-NEXT: [[P4:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 4 462; SSE-NEXT: [[P5:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 5 463; SSE-NEXT: [[P6:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 6 464; SSE-NEXT: [[P7:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 7 465; SSE-NEXT: [[TMP1:%.*]] = bitcast i16* [[P0]] to <8 x i16>* 466; SSE-NEXT: [[TMP2:%.*]] = load <8 x i16>, <8 x i16>* [[TMP1]], align 1 467; SSE-NEXT: [[TMP3:%.*]] = sext <8 x i16> [[TMP2]] to <8 x i32> 468; SSE-NEXT: ret <8 x i32> [[TMP3]] 469; 470; AVX-LABEL: @loadext_8i16_to_8i32( 471; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i16, i16* [[P0:%.*]], i64 1 472; AVX-NEXT: [[P2:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 2 473; AVX-NEXT: [[P3:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 3 474; AVX-NEXT: [[P4:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 4 475; AVX-NEXT: [[P5:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 5 476; AVX-NEXT: [[P6:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 6 477; AVX-NEXT: [[P7:%.*]] = getelementptr inbounds i16, i16* [[P0]], i64 7 478; AVX-NEXT: [[TMP1:%.*]] = bitcast i16* [[P0]] to <8 x i16>* 479; AVX-NEXT: [[TMP2:%.*]] = load <8 x i16>, <8 x i16>* [[TMP1]], align 1 480; AVX-NEXT: [[TMP3:%.*]] = sext <8 x i16> [[TMP2]] to <8 x i32> 481; AVX-NEXT: ret <8 x i32> [[TMP3]] 482; 483 %p1 = getelementptr inbounds i16, i16* %p0, i64 1 484 %p2 = getelementptr inbounds i16, i16* %p0, i64 2 485 %p3 = getelementptr inbounds i16, i16* %p0, i64 3 486 %p4 = getelementptr inbounds i16, i16* %p0, i64 4 487 %p5 = getelementptr inbounds i16, i16* %p0, i64 5 488 %p6 = getelementptr inbounds i16, i16* %p0, i64 6 489 %p7 = getelementptr inbounds i16, i16* %p0, i64 7 490 %i0 = load i16, i16* %p0, align 1 491 %i1 = load i16, i16* %p1, align 1 492 %i2 = load i16, i16* %p2, align 1 493 %i3 = load i16, i16* %p3, align 1 494 %i4 = load i16, i16* %p4, align 1 495 %i5 = load i16, i16* %p5, align 1 496 %i6 = load i16, i16* %p6, align 1 497 %i7 = load i16, i16* %p7, align 1 498 %x0 = sext i16 %i0 to i32 499 %x1 = sext i16 %i1 to i32 500 %x2 = sext i16 %i2 to i32 501 %x3 = sext i16 %i3 to i32 502 %x4 = sext i16 %i4 to i32 503 %x5 = sext i16 %i5 to i32 504 %x6 = sext i16 %i6 to i32 505 %x7 = sext i16 %i7 to i32 506 %v0 = insertelement <8 x i32> undef, i32 %x0, i32 0 507 %v1 = insertelement <8 x i32> %v0, i32 %x1, i32 1 508 %v2 = insertelement <8 x i32> %v1, i32 %x2, i32 2 509 %v3 = insertelement <8 x i32> %v2, i32 %x3, i32 3 510 %v4 = insertelement <8 x i32> %v3, i32 %x4, i32 4 511 %v5 = insertelement <8 x i32> %v4, i32 %x5, i32 5 512 %v6 = insertelement <8 x i32> %v5, i32 %x6, i32 6 513 %v7 = insertelement <8 x i32> %v6, i32 %x7, i32 7 514 ret <8 x i32> %v7 515} 516 517; 518; vXi32 519; 520 521define <2 x i64> @loadext_2i32_to_2i64(i32* %p0) { 522; SSE-LABEL: @loadext_2i32_to_2i64( 523; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i32, i32* [[P0:%.*]], i64 1 524; SSE-NEXT: [[TMP1:%.*]] = bitcast i32* [[P0]] to <2 x i32>* 525; SSE-NEXT: [[TMP2:%.*]] = load <2 x i32>, <2 x i32>* [[TMP1]], align 1 526; SSE-NEXT: [[TMP3:%.*]] = sext <2 x i32> [[TMP2]] to <2 x i64> 527; SSE-NEXT: ret <2 x i64> [[TMP3]] 528; 529; AVX-LABEL: @loadext_2i32_to_2i64( 530; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i32, i32* [[P0:%.*]], i64 1 531; AVX-NEXT: [[TMP1:%.*]] = bitcast i32* [[P0]] to <2 x i32>* 532; AVX-NEXT: [[TMP2:%.*]] = load <2 x i32>, <2 x i32>* [[TMP1]], align 1 533; AVX-NEXT: [[TMP3:%.*]] = sext <2 x i32> [[TMP2]] to <2 x i64> 534; AVX-NEXT: ret <2 x i64> [[TMP3]] 535; 536 %p1 = getelementptr inbounds i32, i32* %p0, i64 1 537 %i0 = load i32, i32* %p0, align 1 538 %i1 = load i32, i32* %p1, align 1 539 %x0 = sext i32 %i0 to i64 540 %x1 = sext i32 %i1 to i64 541 %v0 = insertelement <2 x i64> undef, i64 %x0, i32 0 542 %v1 = insertelement <2 x i64> %v0, i64 %x1, i32 1 543 ret <2 x i64> %v1 544} 545 546define <4 x i64> @loadext_4i32_to_4i64(i32* %p0) { 547; SSE-LABEL: @loadext_4i32_to_4i64( 548; SSE-NEXT: [[P1:%.*]] = getelementptr inbounds i32, i32* [[P0:%.*]], i64 1 549; SSE-NEXT: [[P2:%.*]] = getelementptr inbounds i32, i32* [[P0]], i64 2 550; SSE-NEXT: [[P3:%.*]] = getelementptr inbounds i32, i32* [[P0]], i64 3 551; SSE-NEXT: [[TMP1:%.*]] = bitcast i32* [[P0]] to <4 x i32>* 552; SSE-NEXT: [[TMP2:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 1 553; SSE-NEXT: [[TMP3:%.*]] = sext <4 x i32> [[TMP2]] to <4 x i64> 554; SSE-NEXT: ret <4 x i64> [[TMP3]] 555; 556; AVX-LABEL: @loadext_4i32_to_4i64( 557; AVX-NEXT: [[P1:%.*]] = getelementptr inbounds i32, i32* [[P0:%.*]], i64 1 558; AVX-NEXT: [[P2:%.*]] = getelementptr inbounds i32, i32* [[P0]], i64 2 559; AVX-NEXT: [[P3:%.*]] = getelementptr inbounds i32, i32* [[P0]], i64 3 560; AVX-NEXT: [[TMP1:%.*]] = bitcast i32* [[P0]] to <4 x i32>* 561; AVX-NEXT: [[TMP2:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 1 562; AVX-NEXT: [[TMP3:%.*]] = sext <4 x i32> [[TMP2]] to <4 x i64> 563; AVX-NEXT: ret <4 x i64> [[TMP3]] 564; 565 %p1 = getelementptr inbounds i32, i32* %p0, i64 1 566 %p2 = getelementptr inbounds i32, i32* %p0, i64 2 567 %p3 = getelementptr inbounds i32, i32* %p0, i64 3 568 %i0 = load i32, i32* %p0, align 1 569 %i1 = load i32, i32* %p1, align 1 570 %i2 = load i32, i32* %p2, align 1 571 %i3 = load i32, i32* %p3, align 1 572 %x0 = sext i32 %i0 to i64 573 %x1 = sext i32 %i1 to i64 574 %x2 = sext i32 %i2 to i64 575 %x3 = sext i32 %i3 to i64 576 %v0 = insertelement <4 x i64> undef, i64 %x0, i32 0 577 %v1 = insertelement <4 x i64> %v0, i64 %x1, i32 1 578 %v2 = insertelement <4 x i64> %v1, i64 %x2, i32 2 579 %v3 = insertelement <4 x i64> %v2, i64 %x3, i32 3 580 ret <4 x i64> %v3 581} 582