1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -O2 -S -mattr=avx < %s | FileCheck %s 3; RUN: opt -passes='default<O2>' -S -mattr=avx < %s | FileCheck %s 4 5target triple = "x86_64--" 6target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 7 8; Eliminate redundant shuffles 9 10define <2 x i64> @shuffle_32_add_16_shuffle_32_masks_are_eq(<2 x i64> %v) { 11; CHECK-LABEL: @shuffle_32_add_16_shuffle_32_masks_are_eq( 12; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[V:%.*]] to <8 x i16> 13; CHECK-NEXT: [[TMP2:%.*]] = shl <8 x i16> [[TMP1]], <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 14; CHECK-NEXT: [[BC5:%.*]] = bitcast <8 x i16> [[TMP2]] to <2 x i64> 15; CHECK-NEXT: ret <2 x i64> [[BC5]] 16; 17 %bc0 = bitcast <2 x i64> %v to <4 x i32> 18 %shuffle = shufflevector <4 x i32> %bc0, <4 x i32> zeroinitializer, <4 x i32> <i32 3, i32 2, i32 1, i32 0> 19 %bc1 = bitcast <4 x i32> %shuffle to <2 x i64> 20 %bc2 = bitcast <2 x i64> %bc1 to <8 x i16> 21 %add.i = add <8 x i16> %bc2, %bc2 22 %bc3 = bitcast <8 x i16> %add.i to <2 x i64> 23 %bc4 = bitcast <2 x i64> %bc3 to <4 x i32> 24 %shuffle4 = shufflevector <4 x i32> %bc4, <4 x i32> zeroinitializer, <4 x i32> <i32 3, i32 2, i32 1, i32 0> 25 %bc5 = bitcast <4 x i32> %shuffle4 to <2 x i64> 26 ret <2 x i64> %bc5 27} 28 29; Eliminate redundant shuffles 30 31define <2 x i64> @shuffle_32_add_8_shuffle_32_masks_are_eq(<2 x i64> %v) { 32; CHECK-LABEL: @shuffle_32_add_8_shuffle_32_masks_are_eq( 33; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[V:%.*]] to <16 x i8> 34; CHECK-NEXT: [[TMP2:%.*]] = shl <16 x i8> [[TMP1]], <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 35; CHECK-NEXT: [[BC5:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64> 36; CHECK-NEXT: ret <2 x i64> [[BC5]] 37; 38 %bc0 = bitcast <2 x i64> %v to <4 x i32> 39 %shuffle = shufflevector <4 x i32> %bc0, <4 x i32> zeroinitializer, <4 x i32> <i32 3, i32 2, i32 1, i32 0> 40 %bc1 = bitcast <4 x i32> %shuffle to <2 x i64> 41 %bc2 = bitcast <2 x i64> %bc1 to <16 x i8> 42 %add.i = add <16 x i8> %bc2, %bc2 43 %bc3 = bitcast <16 x i8> %add.i to <2 x i64> 44 %bc4 = bitcast <2 x i64> %bc3 to <4 x i32> 45 %shuffle4 = shufflevector <4 x i32> %bc4, <4 x i32> zeroinitializer, <4 x i32> <i32 3, i32 2, i32 1, i32 0> 46 %bc5 = bitcast <4 x i32> %shuffle4 to <2 x i64> 47 ret <2 x i64> %bc5 48} 49 50; Eliminate redundant shuffles 51 52define <2 x i64> @shuffle_8_add_32_shuffle_8_masks_are_eq(<2 x i64> %v) { 53; CHECK-LABEL: @shuffle_8_add_32_shuffle_8_masks_are_eq( 54; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[V:%.*]] to <4 x i32> 55; CHECK-NEXT: [[TMP2:%.*]] = shl <4 x i32> [[TMP1]], <i32 1, i32 1, i32 1, i32 1> 56; CHECK-NEXT: [[BC5:%.*]] = bitcast <4 x i32> [[TMP2]] to <2 x i64> 57; CHECK-NEXT: ret <2 x i64> [[BC5]] 58; 59 %bc0 = bitcast <2 x i64> %v to <16 x i8> 60 %shuffle = shufflevector <16 x i8> %bc0, <16 x i8> zeroinitializer, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 61 %bc1 = bitcast <16 x i8> %shuffle to <2 x i64> 62 %bc2 = bitcast <2 x i64> %bc1 to <4 x i32> 63 %add.i = add <4 x i32> %bc2, %bc2 64 %bc3 = bitcast <4 x i32> %add.i to <2 x i64> 65 %bc4 = bitcast <2 x i64> %bc3 to <16 x i8> 66 %shuffle4 = shufflevector <16 x i8> %bc4, <16 x i8> zeroinitializer, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 67 %bc5 = bitcast <16 x i8> %shuffle4 to <2 x i64> 68 ret <2 x i64> %bc5 69} 70 71; Single shuffle should sink. 72 73define <8 x i16> @shuffle_32_add_16_masks_are_eq(<4 x i32> %v1, <4 x i32> %v2) { 74; CHECK-LABEL: @shuffle_32_add_16_masks_are_eq( 75; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[V1:%.*]] to <8 x i16> 76; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[V2:%.*]] to <8 x i16> 77; CHECK-NEXT: [[TMP3:%.*]] = add <8 x i16> [[TMP2]], [[TMP1]] 78; CHECK-NEXT: [[ADD:%.*]] = shufflevector <8 x i16> [[TMP3]], <8 x i16> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 79; CHECK-NEXT: ret <8 x i16> [[ADD]] 80; 81 %shuffle1 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 82 %shuffle2 = shufflevector <4 x i32> %v2, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 83 %bc1 = bitcast <4 x i32> %shuffle1 to <8 x i16> 84 %bc2 = bitcast <4 x i32> %shuffle2 to <8 x i16> 85 %add = add <8 x i16> %bc1, %bc2 86 ret <8 x i16> %add 87} 88 89; Sink single shuffle. 90 91define <16 x i8> @shuffle_32_add_8_masks_are_eq(<4 x i32> %v1, <4 x i32> %v2) { 92; CHECK-LABEL: @shuffle_32_add_8_masks_are_eq( 93; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[V1:%.*]] to <16 x i8> 94; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[V2:%.*]] to <16 x i8> 95; CHECK-NEXT: [[TMP3:%.*]] = add <16 x i8> [[TMP2]], [[TMP1]] 96; CHECK-NEXT: [[ADD:%.*]] = shufflevector <16 x i8> [[TMP3]], <16 x i8> poison, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 97; CHECK-NEXT: ret <16 x i8> [[ADD]] 98; 99 %shuffle1 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 100 %shuffle2 = shufflevector <4 x i32> %v2, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 101 %bc1 = bitcast <4 x i32> %shuffle1 to <16 x i8> 102 %bc2 = bitcast <4 x i32> %shuffle2 to <16 x i8> 103 %add = add <16 x i8> %bc1, %bc2 104 ret <16 x i8> %add 105} 106 107; Sink single shuffle. 108 109define <16 x i8> @shuffle_16_add_8_masks_are_eq(<8 x i16> %v1, <8 x i16> %v2) { 110; CHECK-LABEL: @shuffle_16_add_8_masks_are_eq( 111; CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i16> [[V1:%.*]] to <16 x i8> 112; CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i16> [[V2:%.*]] to <16 x i8> 113; CHECK-NEXT: [[TMP3:%.*]] = add <16 x i8> [[TMP2]], [[TMP1]] 114; CHECK-NEXT: [[ADD:%.*]] = shufflevector <16 x i8> [[TMP3]], <16 x i8> poison, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1, i32 8, i32 9, i32 10, i32 11, i32 14, i32 15, i32 12, i32 13> 115; CHECK-NEXT: ret <16 x i8> [[ADD]] 116; 117 %shuffle1 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> <i32 2, i32 3, i32 1, i32 0, i32 4, i32 5, i32 7, i32 6> 118 %shuffle2 = shufflevector <8 x i16> %v2, <8 x i16> undef, <8 x i32> <i32 2, i32 3, i32 1, i32 0, i32 4, i32 5, i32 7, i32 6> 119 %bc1 = bitcast <8 x i16> %shuffle1 to <16 x i8> 120 %bc2 = bitcast <8 x i16> %shuffle2 to <16 x i8> 121 %add = add <16 x i8> %bc1, %bc2 122 ret <16 x i8> %add 123} 124 125; Sink single shuffle. 126 127define <4 x i32> @shuffle_16_add_32_masks_are_eq_and_can_be_converted_up(<8 x i16> %v1, <8 x i16> %v2) { 128; CHECK-LABEL: @shuffle_16_add_32_masks_are_eq_and_can_be_converted_up( 129; CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i16> [[V1:%.*]] to <4 x i32> 130; CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i16> [[V2:%.*]] to <4 x i32> 131; CHECK-NEXT: [[TMP3:%.*]] = add <4 x i32> [[TMP2]], [[TMP1]] 132; CHECK-NEXT: [[ADD:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 0, i32 1> 133; CHECK-NEXT: ret <4 x i32> [[ADD]] 134; 135 %shuffle1 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 136 %shuffle2 = shufflevector <8 x i16> %v2, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 137 %bc1 = bitcast <8 x i16> %shuffle1 to <4 x i32> 138 %bc2 = bitcast <8 x i16> %shuffle2 to <4 x i32> 139 %add = add <4 x i32> %bc1, %bc2 140 ret <4 x i32> %add 141} 142 143; Sink single shuffle. 144 145define <4 x i32> @shuffle_8_add_32_masks_are_eq_and_can_be_converted_up(<16 x i8> %v1, <16 x i8> %v2) { 146; CHECK-LABEL: @shuffle_8_add_32_masks_are_eq_and_can_be_converted_up( 147; CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[V1:%.*]] to <4 x i32> 148; CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i8> [[V2:%.*]] to <4 x i32> 149; CHECK-NEXT: [[TMP3:%.*]] = add <4 x i32> [[TMP2]], [[TMP1]] 150; CHECK-NEXT: [[ADD:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 2, i32 3> 151; CHECK-NEXT: ret <4 x i32> [[ADD]] 152; 153 %shuffle1 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 154 %shuffle2 = shufflevector <16 x i8> %v2, <16 x i8> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 155 %bc1 = bitcast <16 x i8> %shuffle1 to <4 x i32> 156 %bc2 = bitcast <16 x i8> %shuffle2 to <4 x i32> 157 %add = add <4 x i32> %bc1, %bc2 158 ret <4 x i32> %add 159} 160 161; shuffle<8 x i16>( bitcast<8 x i16>( shuffle<4 x i32>(v))) 162; TODO: Squash shuffles and widen type? 163 164define <8 x i16> @shuffle_32_bitcast_16_shuffle_16_can_be_converted_up(<4 x i32> %v1) { 165; CHECK-LABEL: @shuffle_32_bitcast_16_shuffle_16_can_be_converted_up( 166; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[V1:%.*]] to <8 x i16> 167; CHECK-NEXT: [[BC1:%.*]] = shufflevector <8 x i16> [[TMP1]], <8 x i16> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 168; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <8 x i16> [[BC1]], <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 169; CHECK-NEXT: ret <8 x i16> [[SHUFFLE2]] 170; 171 %shuffle1 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 172 %bc1 = bitcast <4 x i32> %shuffle1 to <8 x i16> 173 %shuffle2 = shufflevector <8 x i16> %bc1, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 174 ret <8 x i16> %shuffle2 175} 176 177; shuffle<8 x i16>( bitcast<8 x i16>( shuffle<4 x i32>(v))) 178; TODO: Squash shuffles? 179 180define <8 x i16> @shuffle_32_bitcast_16_shuffle_16_can_not_be_converted_up(<4 x i32> %v1) { 181; CHECK-LABEL: @shuffle_32_bitcast_16_shuffle_16_can_not_be_converted_up( 182; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[V1:%.*]] to <8 x i16> 183; CHECK-NEXT: [[BC1:%.*]] = shufflevector <8 x i16> [[TMP1]], <8 x i16> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 184; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <8 x i16> [[BC1]], <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 185; CHECK-NEXT: ret <8 x i16> [[SHUFFLE2]] 186; 187 %shuffle1 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 188 %bc1 = bitcast <4 x i32> %shuffle1 to <8 x i16> 189 %shuffle2 = shufflevector <8 x i16> %bc1, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 190 ret <8 x i16> %shuffle2 191} 192 193; shuffle<16 x i8>( bitcast<16 x i8>( shuffle<4 x i32>(v))) 194; TODO: Squash shuffles and widen type? 195 196define <16 x i8> @shuffle_32_bitcast_8_shuffle_8_can_be_converted_up(<4 x i32> %v1) { 197; CHECK-LABEL: @shuffle_32_bitcast_8_shuffle_8_can_be_converted_up( 198; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[V1:%.*]] to <16 x i8> 199; CHECK-NEXT: [[BC1:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> poison, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 200; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <16 x i8> [[BC1]], <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 201; CHECK-NEXT: ret <16 x i8> [[SHUFFLE2]] 202; 203 %shuffle1 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 204 %bc1 = bitcast <4 x i32> %shuffle1 to <16 x i8> 205 %shuffle2 = shufflevector <16 x i8> %bc1, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 206 ret <16 x i8> %shuffle2 207} 208 209; shuffle<16 x i8>( bitcast<16 x i8>( shuffle<4 x i32>(v))) 210; TODO: Squash shuffles? 211 212define <16 x i8> @shuffle_32_bitcast_8_shuffle_8_can_not_be_converted_up(<4 x i32> %v1) { 213; CHECK-LABEL: @shuffle_32_bitcast_8_shuffle_8_can_not_be_converted_up( 214; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[V1:%.*]] to <16 x i8> 215; CHECK-NEXT: [[BC1:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> poison, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 216; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <16 x i8> [[BC1]], <16 x i8> undef, <16 x i32> <i32 5, i32 4, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 217; CHECK-NEXT: ret <16 x i8> [[SHUFFLE2]] 218; 219 %shuffle1 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 220 %bc1 = bitcast <4 x i32> %shuffle1 to <16 x i8> 221 %shuffle2 = shufflevector <16 x i8> %bc1, <16 x i8> undef, <16 x i32> <i32 5, i32 4, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 222 ret <16 x i8> %shuffle2 223} 224 225; shuffle<4 x i32>( bitcast<4 x i32>( shuffle<16 x i8>(v))) 226; TODO: squash shuffles? 227 228define <4 x i32> @shuffle_8_bitcast_32_shuffle_32_can_be_converted_up(<16 x i8> %v1) { 229; CHECK-LABEL: @shuffle_8_bitcast_32_shuffle_32_can_be_converted_up( 230; CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[V1:%.*]] to <4 x i32> 231; CHECK-NEXT: [[BC1:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 232; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <4 x i32> [[BC1]], <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 233; CHECK-NEXT: ret <4 x i32> [[SHUFFLE2]] 234; 235 %shuffle1 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 236 %bc1 = bitcast <16 x i8> %shuffle1 to <4 x i32> 237 %shuffle2 = shufflevector <4 x i32> %bc1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 238 ret <4 x i32> %shuffle2 239} 240 241; shuffle<4 x i32>( bitcast<4 x i32>( shuffle<8 x i16>(v))) 242; TODO: squash shuffles? 243 244define <4 x i32> @shuffle_16_bitcast_32_shuffle_32_can_be_converted_up(<8 x i16> %v1) { 245; CHECK-LABEL: @shuffle_16_bitcast_32_shuffle_32_can_be_converted_up( 246; CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i16> [[V1:%.*]] to <4 x i32> 247; CHECK-NEXT: [[BC1:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 248; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <4 x i32> [[BC1]], <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 249; CHECK-NEXT: ret <4 x i32> [[SHUFFLE2]] 250; 251 %shuffle1 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 252 %bc1 = bitcast <8 x i16> %shuffle1 to <4 x i32> 253 %shuffle2 = shufflevector <4 x i32> %bc1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 254 ret <4 x i32> %shuffle2 255} 256 257; shuffle<4 x i32>( bitcast<4 x i32>( shuffle<16 x i8>(v))) 258; TODO: Narrow and squash shuffles? 259 260define <4 x i32> @shuffle_8_bitcast_32_shuffle_32_can_not_be_converted_up(<16 x i8> %v1) { 261; CHECK-LABEL: @shuffle_8_bitcast_32_shuffle_32_can_not_be_converted_up( 262; CHECK-NEXT: [[SHUFFLE1:%.*]] = shufflevector <16 x i8> [[V1:%.*]], <16 x i8> undef, <16 x i32> <i32 9, i32 8, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 263; CHECK-NEXT: [[BC1:%.*]] = bitcast <16 x i8> [[SHUFFLE1]] to <4 x i32> 264; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <4 x i32> [[BC1]], <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 265; CHECK-NEXT: ret <4 x i32> [[SHUFFLE2]] 266; 267 %shuffle1 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> <i32 9, i32 8, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 268 %bc1 = bitcast <16 x i8> %shuffle1 to <4 x i32> 269 %shuffle2 = shufflevector <4 x i32> %bc1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 270 ret <4 x i32> %shuffle2 271} 272 273; shuffle<4 x i32>( bitcast<4 x i32>( shuffle<8 x i16>(v))) 274; TODO: Narrow and squash shuffles? 275 276define <4 x i32> @shuffle_16_bitcast_32_shuffle_32_can_not_be_converted_up(<8 x i16> %v1) { 277; CHECK-LABEL: @shuffle_16_bitcast_32_shuffle_32_can_not_be_converted_up( 278; CHECK-NEXT: [[SHUFFLE1:%.*]] = shufflevector <8 x i16> [[V1:%.*]], <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 279; CHECK-NEXT: [[BC1:%.*]] = bitcast <8 x i16> [[SHUFFLE1]] to <4 x i32> 280; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <4 x i32> [[BC1]], <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 281; CHECK-NEXT: ret <4 x i32> [[SHUFFLE2]] 282; 283 %shuffle1 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 284 %bc1 = bitcast <8 x i16> %shuffle1 to <4 x i32> 285 %shuffle2 = shufflevector <4 x i32> %bc1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0> 286 ret <4 x i32> %shuffle2 287} 288 289; shuffle<8 x i16>( bitcast<8 x i16>( shuffle<16 x i8>(v))) 290; TODO: squash shuffles and widen type? 291 292define <8 x i16> @shuffle_8_bitcast_16_shuffle_16_can__be_converted_up(<16 x i8> %v1) { 293; CHECK-LABEL: @shuffle_8_bitcast_16_shuffle_16_can__be_converted_up( 294; CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[V1:%.*]] to <8 x i16> 295; CHECK-NEXT: [[BC1:%.*]] = shufflevector <8 x i16> [[TMP1]], <8 x i16> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 296; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <8 x i16> [[BC1]], <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 297; CHECK-NEXT: ret <8 x i16> [[SHUFFLE2]] 298; 299 %shuffle1 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 300 %bc1 = bitcast <16 x i8> %shuffle1 to <8 x i16> 301 %shuffle2 = shufflevector <8 x i16> %bc1, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 302 ret <8 x i16> %shuffle2 303} 304 305; shuffle<8 x i16>( bitcast<8 x i16>( shuffle<16 x i8>(v))) 306; TODO: Narrow and squash shuffles? 307 308define <8 x i16> @shuffle_8_bitcast_16_shuffle_16_can_not_be_converted_up(<16 x i8> %v1) { 309; CHECK-LABEL: @shuffle_8_bitcast_16_shuffle_16_can_not_be_converted_up( 310; CHECK-NEXT: [[SHUFFLE1:%.*]] = shufflevector <16 x i8> [[V1:%.*]], <16 x i8> undef, <16 x i32> <i32 9, i32 8, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 311; CHECK-NEXT: [[BC1:%.*]] = bitcast <16 x i8> [[SHUFFLE1]] to <8 x i16> 312; CHECK-NEXT: [[SHUFFLE2:%.*]] = shufflevector <8 x i16> [[BC1]], <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 313; CHECK-NEXT: ret <8 x i16> [[SHUFFLE2]] 314; 315 %shuffle1 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> <i32 9, i32 8, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 316 %bc1 = bitcast <16 x i8> %shuffle1 to <8 x i16> 317 %shuffle2 = shufflevector <8 x i16> %bc1, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 318 ret <8 x i16> %shuffle2 319} 320