1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S -data-layout="E" | FileCheck %s --check-prefixes=ALL 3; RUN: opt < %s -passes=instcombine -S -data-layout="e" | FileCheck %s --check-prefixes=ALL 4 5declare void @use(i8) 6declare void @use64(i64) 7 8define <4 x i16> @low_index_same_length_poison_basevec(i64 %x) { 9; ALL-LABEL: @low_index_same_length_poison_basevec( 10; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 11; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 0 12; ALL-NEXT: ret <4 x i16> [[R]] 13; 14 %t = trunc i64 %x to i16 15 %r = insertelement <4 x i16> poison, i16 %t, i64 0 16 ret <4 x i16> %r 17} 18 19define <4 x i16> @high_index_same_length_poison_basevec(i64 %x) { 20; ALL-LABEL: @high_index_same_length_poison_basevec( 21; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 22; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 3 23; ALL-NEXT: ret <4 x i16> [[R]] 24; 25 %t = trunc i64 %x to i16 26 %r = insertelement <4 x i16> poison, i16 %t, i64 3 27 ret <4 x i16> %r 28} 29 30define <4 x i16> @wrong_index_same_length_poison_basevec(i64 %x) { 31; ALL-LABEL: @wrong_index_same_length_poison_basevec( 32; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 33; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1 34; ALL-NEXT: ret <4 x i16> [[R]] 35; 36 %t = trunc i64 %x to i16 37 %r = insertelement <4 x i16> poison, i16 %t, i64 1 38 ret <4 x i16> %r 39} 40 41define <8 x i16> @low_index_longer_length_poison_basevec(i64 %x) { 42; ALL-LABEL: @low_index_longer_length_poison_basevec( 43; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 44; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 0 45; ALL-NEXT: ret <8 x i16> [[R]] 46; 47 %t = trunc i64 %x to i16 48 %r = insertelement <8 x i16> poison, i16 %t, i64 0 49 ret <8 x i16> %r 50} 51 52define <8 x i16> @high_index_longer_length_poison_basevec(i64 %x) { 53; ALL-LABEL: @high_index_longer_length_poison_basevec( 54; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 55; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 3 56; ALL-NEXT: ret <8 x i16> [[R]] 57; 58 %t = trunc i64 %x to i16 59 %r = insertelement <8 x i16> poison, i16 %t, i64 3 60 ret <8 x i16> %r 61} 62 63define <8 x i16> @wrong_index_longer_length_poison_basevec(i64 %x) { 64; ALL-LABEL: @wrong_index_longer_length_poison_basevec( 65; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 66; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 7 67; ALL-NEXT: ret <8 x i16> [[R]] 68; 69 %t = trunc i64 %x to i16 70 %r = insertelement <8 x i16> poison, i16 %t, i64 7 71 ret <8 x i16> %r 72} 73 74define <2 x i16> @low_index_shorter_length_poison_basevec(i64 %x) { 75; ALL-LABEL: @low_index_shorter_length_poison_basevec( 76; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 77; ALL-NEXT: [[R:%.*]] = insertelement <2 x i16> poison, i16 [[T]], i64 0 78; ALL-NEXT: ret <2 x i16> [[R]] 79; 80 %t = trunc i64 %x to i16 81 %r = insertelement <2 x i16> poison, i16 %t, i64 0 82 ret <2 x i16> %r 83} 84 85define <4 x i8> @wrong_index_shorter_length_poison_basevec(i64 %x) { 86; ALL-LABEL: @wrong_index_shorter_length_poison_basevec( 87; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i8 88; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 3 89; ALL-NEXT: ret <4 x i8> [[R]] 90; 91 %t = trunc i64 %x to i8 92 %r = insertelement <4 x i8> poison, i8 %t, i64 3 93 ret <4 x i8> %r 94} 95 96define <4 x i8> @wrong_width_low_index_shorter_length_poison_basevec(i65 %x) { 97; ALL-LABEL: @wrong_width_low_index_shorter_length_poison_basevec( 98; ALL-NEXT: [[T:%.*]] = trunc i65 [[X:%.*]] to i8 99; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 0 100; ALL-NEXT: ret <4 x i8> [[R]] 101; 102 %t = trunc i65 %x to i8 103 %r = insertelement <4 x i8> poison, i8 %t, i64 0 104 ret <4 x i8> %r 105} 106 107define <4 x i8> @low_index_shorter_length_poison_basevec_extra_use(i64 %x) { 108; ALL-LABEL: @low_index_shorter_length_poison_basevec_extra_use( 109; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i8 110; ALL-NEXT: call void @use(i8 [[T]]) 111; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 0 112; ALL-NEXT: ret <4 x i8> [[R]] 113; 114 %t = trunc i64 %x to i8 115 call void @use(i8 %t) 116 %r = insertelement <4 x i8> poison, i8 %t, i64 0 117 ret <4 x i8> %r 118} 119 120define <4 x i16> @lshr_same_length_poison_basevec_le(i64 %x) { 121; ALL-LABEL: @lshr_same_length_poison_basevec_le( 122; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32 123; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 124; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 2 125; ALL-NEXT: ret <4 x i16> [[R]] 126; 127 %s = lshr i64 %x, 32 128 %t = trunc i64 %s to i16 129 %r = insertelement <4 x i16> poison, i16 %t, i64 2 130 ret <4 x i16> %r 131} 132 133define <4 x i16> @lshr_same_length_poison_basevec_be(i64 %x) { 134; ALL-LABEL: @lshr_same_length_poison_basevec_be( 135; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32 136; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 137; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1 138; ALL-NEXT: ret <4 x i16> [[R]] 139; 140 %s = lshr i64 %x, 32 141 %t = trunc i64 %s to i16 142 %r = insertelement <4 x i16> poison, i16 %t, i64 1 143 ret <4 x i16> %r 144} 145 146define <4 x i16> @lshr_same_length_poison_basevec_both_endian(i64 %x) { 147; ALL-LABEL: @lshr_same_length_poison_basevec_both_endian( 148; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48 149; ALL-NEXT: [[T:%.*]] = trunc nuw i64 [[S]] to i16 150; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 0 151; ALL-NEXT: ret <4 x i16> [[R]] 152; 153 %s = lshr i64 %x, 48 154 %t = trunc i64 %s to i16 155 %r = insertelement <4 x i16> poison, i16 %t, i64 0 156 ret <4 x i16> %r 157} 158 159define <4 x i16> @lshr_wrong_index_same_length_poison_basevec(i64 %x) { 160; ALL-LABEL: @lshr_wrong_index_same_length_poison_basevec( 161; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48 162; ALL-NEXT: [[T:%.*]] = trunc nuw i64 [[S]] to i16 163; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1 164; ALL-NEXT: ret <4 x i16> [[R]] 165; 166 %s = lshr i64 %x, 48 167 %t = trunc i64 %s to i16 168 %r = insertelement <4 x i16> poison, i16 %t, i64 1 169 ret <4 x i16> %r 170} 171 172define <8 x i16> @lshr_longer_length_poison_basevec_le(i64 %x) { 173; ALL-LABEL: @lshr_longer_length_poison_basevec_le( 174; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48 175; ALL-NEXT: [[T:%.*]] = trunc nuw i64 [[S]] to i16 176; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 3 177; ALL-NEXT: ret <8 x i16> [[R]] 178; 179 %s = lshr i64 %x, 48 180 %t = trunc i64 %s to i16 181 %r = insertelement <8 x i16> poison, i16 %t, i64 3 182 ret <8 x i16> %r 183} 184 185define <8 x i16> @lshr_longer_length_poison_basevec_be(i64 %x) { 186; ALL-LABEL: @lshr_longer_length_poison_basevec_be( 187; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32 188; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 189; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 1 190; ALL-NEXT: ret <8 x i16> [[R]] 191; 192 %s = lshr i64 %x, 32 193 %t = trunc i64 %s to i16 194 %r = insertelement <8 x i16> poison, i16 %t, i64 1 195 ret <8 x i16> %r 196} 197 198define <8 x i16> @lshr_wrong_index_longer_length_poison_basevec(i64 %x) { 199; ALL-LABEL: @lshr_wrong_index_longer_length_poison_basevec( 200; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 16 201; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 202; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 6 203; ALL-NEXT: ret <8 x i16> [[R]] 204; 205 %s = lshr i64 %x, 16 206 %t = trunc i64 %s to i16 207 %r = insertelement <8 x i16> poison, i16 %t, i64 6 208 ret <8 x i16> %r 209} 210 211define <2 x i16> @lshr_shorter_length_poison_basevec_le(i64 %x) { 212; ALL-LABEL: @lshr_shorter_length_poison_basevec_le( 213; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 16 214; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 215; ALL-NEXT: [[R:%.*]] = insertelement <2 x i16> poison, i16 [[T]], i64 1 216; ALL-NEXT: ret <2 x i16> [[R]] 217; 218 %s = lshr i64 %x, 16 219 %t = trunc i64 %s to i16 220 %r = insertelement <2 x i16> poison, i16 %t, i64 1 221 ret <2 x i16> %r 222} 223 224define <4 x i8> @lshr_shorter_length_poison_basevec_be(i64 %x) { 225; ALL-LABEL: @lshr_shorter_length_poison_basevec_be( 226; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 40 227; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8 228; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 2 229; ALL-NEXT: ret <4 x i8> [[R]] 230; 231 %s = lshr i64 %x, 40 232 %t = trunc i64 %s to i8 233 %r = insertelement <4 x i8> poison, i8 %t, i64 2 234 ret <4 x i8> %r 235} 236 237define <4 x i8> @lshr_wrong_index_shorter_length_poison_basevec(i64 %x) { 238; ALL-LABEL: @lshr_wrong_index_shorter_length_poison_basevec( 239; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 40 240; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8 241; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 3 242; ALL-NEXT: ret <4 x i8> [[R]] 243; 244 %s = lshr i64 %x, 40 245 %t = trunc i64 %s to i8 246 %r = insertelement <4 x i8> poison, i8 %t, i64 3 247 ret <4 x i8> %r 248} 249 250define <4 x i8> @lshr_wrong_shift_shorter_length_poison_basevec(i64 %x) { 251; ALL-LABEL: @lshr_wrong_shift_shorter_length_poison_basevec( 252; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 57 253; ALL-NEXT: [[T:%.*]] = trunc nuw nsw i64 [[S]] to i8 254; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 0 255; ALL-NEXT: ret <4 x i8> [[R]] 256; 257 %s = lshr i64 %x, 57 258 %t = trunc i64 %s to i8 259 %r = insertelement <4 x i8> poison, i8 %t, i64 0 260 ret <4 x i8> %r 261} 262 263define <4 x i8> @lshr_shorter_length_poison_basevec_be_extra_use(i64 %x) { 264; ALL-LABEL: @lshr_shorter_length_poison_basevec_be_extra_use( 265; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 40 266; ALL-NEXT: call void @use64(i64 [[S]]) 267; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8 268; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 2 269; ALL-NEXT: ret <4 x i8> [[R]] 270; 271 %s = lshr i64 %x, 40 272 call void @use64(i64 %s) 273 %t = trunc i64 %s to i8 274 %r = insertelement <4 x i8> poison, i8 %t, i64 2 275 ret <4 x i8> %r 276} 277 278define <4 x i16> @low_index_same_length_basevec(i64 %x, <4 x i16> %v) { 279; ALL-LABEL: @low_index_same_length_basevec( 280; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 281; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 0 282; ALL-NEXT: ret <4 x i16> [[R]] 283; 284 %t = trunc i64 %x to i16 285 %r = insertelement <4 x i16> %v, i16 %t, i64 0 286 ret <4 x i16> %r 287} 288 289define <4 x i16> @high_index_same_length_basevec(i64 %x, <4 x i16> %v) { 290; ALL-LABEL: @high_index_same_length_basevec( 291; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 292; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 3 293; ALL-NEXT: ret <4 x i16> [[R]] 294; 295 %t = trunc i64 %x to i16 296 %r = insertelement <4 x i16> %v, i16 %t, i64 3 297 ret <4 x i16> %r 298} 299 300define <4 x i16> @wrong_index_same_length_basevec(i64 %x, <4 x i16> %v) { 301; ALL-LABEL: @wrong_index_same_length_basevec( 302; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 303; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 1 304; ALL-NEXT: ret <4 x i16> [[R]] 305; 306 %t = trunc i64 %x to i16 307 %r = insertelement <4 x i16> %v, i16 %t, i64 1 308 ret <4 x i16> %r 309} 310 311define <8 x i16> @low_index_longer_length_basevec(i64 %x, <8 x i16> %v) { 312; ALL-LABEL: @low_index_longer_length_basevec( 313; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 314; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 0 315; ALL-NEXT: ret <8 x i16> [[R]] 316; 317 %t = trunc i64 %x to i16 318 %r = insertelement <8 x i16> %v, i16 %t, i64 0 319 ret <8 x i16> %r 320} 321 322define <8 x i16> @high_index_longer_length_basevec(i64 %x, <8 x i16> %v) { 323; ALL-LABEL: @high_index_longer_length_basevec( 324; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 325; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 3 326; ALL-NEXT: ret <8 x i16> [[R]] 327; 328 %t = trunc i64 %x to i16 329 %r = insertelement <8 x i16> %v, i16 %t, i64 3 330 ret <8 x i16> %r 331} 332 333define <8 x i16> @wrong_index_longer_length_basevec(i64 %x, <8 x i16> %v) { 334; ALL-LABEL: @wrong_index_longer_length_basevec( 335; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 336; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 7 337; ALL-NEXT: ret <8 x i16> [[R]] 338; 339 %t = trunc i64 %x to i16 340 %r = insertelement <8 x i16> %v, i16 %t, i64 7 341 ret <8 x i16> %r 342} 343 344define <2 x i16> @low_index_shorter_length_basevec(i64 %x, <2 x i16> %v) { 345; ALL-LABEL: @low_index_shorter_length_basevec( 346; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16 347; ALL-NEXT: [[R:%.*]] = insertelement <2 x i16> [[V:%.*]], i16 [[T]], i64 0 348; ALL-NEXT: ret <2 x i16> [[R]] 349; 350 %t = trunc i64 %x to i16 351 %r = insertelement <2 x i16> %v, i16 %t, i64 0 352 ret <2 x i16> %r 353} 354 355define <4 x i8> @wrong_index_shorter_length_basevec(i64 %x, <4 x i8> %v) { 356; ALL-LABEL: @wrong_index_shorter_length_basevec( 357; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i8 358; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[T]], i64 3 359; ALL-NEXT: ret <4 x i8> [[R]] 360; 361 %t = trunc i64 %x to i8 362 %r = insertelement <4 x i8> %v, i8 %t, i64 3 363 ret <4 x i8> %r 364} 365 366define <4 x i16> @lshr_same_length_basevec_le(i64 %x, <4 x i16> %v) { 367; ALL-LABEL: @lshr_same_length_basevec_le( 368; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32 369; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 370; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 2 371; ALL-NEXT: ret <4 x i16> [[R]] 372; 373 %s = lshr i64 %x, 32 374 %t = trunc i64 %s to i16 375 %r = insertelement <4 x i16> %v, i16 %t, i64 2 376 ret <4 x i16> %r 377} 378 379define <4 x i16> @lshr_same_length_basevec_be(i64 %x, <4 x i16> %v) { 380; ALL-LABEL: @lshr_same_length_basevec_be( 381; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32 382; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 383; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 1 384; ALL-NEXT: ret <4 x i16> [[R]] 385; 386 %s = lshr i64 %x, 32 387 %t = trunc i64 %s to i16 388 %r = insertelement <4 x i16> %v, i16 %t, i64 1 389 ret <4 x i16> %r 390} 391 392define <4 x i16> @lshr_same_length_basevec_both_endian(i64 %x, <4 x i16> %v) { 393; ALL-LABEL: @lshr_same_length_basevec_both_endian( 394; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48 395; ALL-NEXT: [[T:%.*]] = trunc nuw i64 [[S]] to i16 396; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 3 397; ALL-NEXT: ret <4 x i16> [[R]] 398; 399 %s = lshr i64 %x, 48 400 %t = trunc i64 %s to i16 401 %r = insertelement <4 x i16> %v, i16 %t, i64 3 402 ret <4 x i16> %r 403} 404 405define <4 x i16> @lshr_wrong_index_same_length_basevec(i64 %x, <4 x i16> %v) { 406; ALL-LABEL: @lshr_wrong_index_same_length_basevec( 407; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48 408; ALL-NEXT: [[T:%.*]] = trunc nuw i64 [[S]] to i16 409; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 1 410; ALL-NEXT: ret <4 x i16> [[R]] 411; 412 %s = lshr i64 %x, 48 413 %t = trunc i64 %s to i16 414 %r = insertelement <4 x i16> %v, i16 %t, i64 1 415 ret <4 x i16> %r 416} 417 418define <8 x i16> @lshr_longer_length_basevec_le(i64 %x, <8 x i16> %v) { 419; ALL-LABEL: @lshr_longer_length_basevec_le( 420; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48 421; ALL-NEXT: [[T:%.*]] = trunc nuw i64 [[S]] to i16 422; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 3 423; ALL-NEXT: ret <8 x i16> [[R]] 424; 425 %s = lshr i64 %x, 48 426 %t = trunc i64 %s to i16 427 %r = insertelement <8 x i16> %v, i16 %t, i64 3 428 ret <8 x i16> %r 429} 430 431define <8 x i16> @lshr_longer_length_basevec_be(i64 %x, <8 x i16> %v) { 432; ALL-LABEL: @lshr_longer_length_basevec_be( 433; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32 434; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 435; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 1 436; ALL-NEXT: ret <8 x i16> [[R]] 437; 438 %s = lshr i64 %x, 32 439 %t = trunc i64 %s to i16 440 %r = insertelement <8 x i16> %v, i16 %t, i64 1 441 ret <8 x i16> %r 442} 443 444define <8 x i16> @lshr_wrong_index_longer_length_basevec(i64 %x, <8 x i16> %v) { 445; ALL-LABEL: @lshr_wrong_index_longer_length_basevec( 446; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 16 447; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 448; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 6 449; ALL-NEXT: ret <8 x i16> [[R]] 450; 451 %s = lshr i64 %x, 16 452 %t = trunc i64 %s to i16 453 %r = insertelement <8 x i16> %v, i16 %t, i64 6 454 ret <8 x i16> %r 455} 456 457define <2 x i16> @lshr_shorter_length_basevec_le(i64 %x, <2 x i16> %v) { 458; ALL-LABEL: @lshr_shorter_length_basevec_le( 459; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 16 460; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16 461; ALL-NEXT: [[R:%.*]] = insertelement <2 x i16> [[V:%.*]], i16 [[T]], i64 1 462; ALL-NEXT: ret <2 x i16> [[R]] 463; 464 %s = lshr i64 %x, 16 465 %t = trunc i64 %s to i16 466 %r = insertelement <2 x i16> %v, i16 %t, i64 1 467 ret <2 x i16> %r 468} 469 470define <4 x i8> @lshr_shorter_length_basevec_be(i64 %x, <4 x i8> %v) { 471; ALL-LABEL: @lshr_shorter_length_basevec_be( 472; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48 473; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8 474; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[T]], i64 1 475; ALL-NEXT: ret <4 x i8> [[R]] 476; 477 %s = lshr i64 %x, 48 478 %t = trunc i64 %s to i8 479 %r = insertelement <4 x i8> %v, i8 %t, i64 1 480 ret <4 x i8> %r 481} 482 483define <4 x i8> @lshr_wrong_index_shorter_length_basevec(i64 %x, <4 x i8> %v) { 484; ALL-LABEL: @lshr_wrong_index_shorter_length_basevec( 485; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 40 486; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8 487; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[T]], i64 3 488; ALL-NEXT: ret <4 x i8> [[R]] 489; 490 %s = lshr i64 %x, 40 491 %t = trunc i64 %s to i8 492 %r = insertelement <4 x i8> %v, i8 %t, i64 3 493 ret <4 x i8> %r 494} 495