1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -slp-vectorizer -S -o - -mtriple=x86_64-unknown-linux -mcpu=bdver2 -instcombine | FileCheck %s 3 4define <2 x i8> @g(<2 x i8> %x, <2 x i8> %y) { 5; CHECK-LABEL: @g( 6; CHECK-NEXT: [[X0:%.*]] = extractelement <2 x i8> [[X:%.*]], i32 0 7; CHECK-NEXT: [[Y1:%.*]] = extractelement <2 x i8> [[Y:%.*]], i32 1 8; CHECK-NEXT: [[X0X0:%.*]] = mul i8 [[X0]], [[X0]] 9; CHECK-NEXT: [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]] 10; CHECK-NEXT: [[INS1:%.*]] = insertelement <2 x i8> undef, i8 [[X0X0]], i32 0 11; CHECK-NEXT: [[INS2:%.*]] = insertelement <2 x i8> [[INS1]], i8 [[Y1Y1]], i32 1 12; CHECK-NEXT: ret <2 x i8> [[INS2]] 13; 14 %x0 = extractelement <2 x i8> %x, i32 0 15 %y1 = extractelement <2 x i8> %y, i32 1 16 %x0x0 = mul i8 %x0, %x0 17 %y1y1 = mul i8 %y1, %y1 18 %ins1 = insertelement <2 x i8> undef, i8 %x0x0, i32 0 19 %ins2 = insertelement <2 x i8> %ins1, i8 %y1y1, i32 1 20 ret <2 x i8> %ins2 21} 22 23define <4 x i8> @h(<4 x i8> %x, <4 x i8> %y) { 24; CHECK-LABEL: @h( 25; CHECK-NEXT: [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0 26; CHECK-NEXT: [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3 27; CHECK-NEXT: [[Y1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 1 28; CHECK-NEXT: [[Y2:%.*]] = extractelement <4 x i8> [[Y]], i32 2 29; CHECK-NEXT: [[X0X0:%.*]] = mul i8 [[X0]], [[X0]] 30; CHECK-NEXT: [[X3X3:%.*]] = mul i8 [[X3]], [[X3]] 31; CHECK-NEXT: [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]] 32; CHECK-NEXT: [[Y2Y2:%.*]] = mul i8 [[Y2]], [[Y2]] 33; CHECK-NEXT: [[INS1:%.*]] = insertelement <4 x i8> undef, i8 [[X0X0]], i32 0 34; CHECK-NEXT: [[INS2:%.*]] = insertelement <4 x i8> [[INS1]], i8 [[X3X3]], i32 1 35; CHECK-NEXT: [[INS3:%.*]] = insertelement <4 x i8> [[INS2]], i8 [[Y1Y1]], i32 2 36; CHECK-NEXT: [[INS4:%.*]] = insertelement <4 x i8> [[INS3]], i8 [[Y2Y2]], i32 3 37; CHECK-NEXT: ret <4 x i8> [[INS4]] 38; 39 %x0 = extractelement <4 x i8> %x, i32 0 40 %x3 = extractelement <4 x i8> %x, i32 3 41 %y1 = extractelement <4 x i8> %y, i32 1 42 %y2 = extractelement <4 x i8> %y, i32 2 43 %x0x0 = mul i8 %x0, %x0 44 %x3x3 = mul i8 %x3, %x3 45 %y1y1 = mul i8 %y1, %y1 46 %y2y2 = mul i8 %y2, %y2 47 %ins1 = insertelement <4 x i8> undef, i8 %x0x0, i32 0 48 %ins2 = insertelement <4 x i8> %ins1, i8 %x3x3, i32 1 49 %ins3 = insertelement <4 x i8> %ins2, i8 %y1y1, i32 2 50 %ins4 = insertelement <4 x i8> %ins3, i8 %y2y2, i32 3 51 ret <4 x i8> %ins4 52} 53 54define <4 x i8> @h_undef(<4 x i8> %x, <4 x i8> %y) { 55; CHECK-LABEL: @h_undef( 56; CHECK-NEXT: [[X3:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 3 57; CHECK-NEXT: [[Y1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 1 58; CHECK-NEXT: [[Y2:%.*]] = extractelement <4 x i8> [[Y]], i32 2 59; CHECK-NEXT: [[X3X3:%.*]] = mul i8 [[X3]], [[X3]] 60; CHECK-NEXT: [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]] 61; CHECK-NEXT: [[Y2Y2:%.*]] = mul i8 [[Y2]], [[Y2]] 62; CHECK-NEXT: [[INS2:%.*]] = insertelement <4 x i8> undef, i8 [[X3X3]], i32 1 63; CHECK-NEXT: [[INS3:%.*]] = insertelement <4 x i8> [[INS2]], i8 [[Y1Y1]], i32 2 64; CHECK-NEXT: [[INS4:%.*]] = insertelement <4 x i8> [[INS3]], i8 [[Y2Y2]], i32 3 65; CHECK-NEXT: ret <4 x i8> [[INS4]] 66; 67 %x0 = extractelement <4 x i8> undef, i32 0 68 %x3 = extractelement <4 x i8> %x, i32 3 69 %y1 = extractelement <4 x i8> %y, i32 1 70 %y2 = extractelement <4 x i8> %y, i32 2 71 %x0x0 = mul i8 %x0, %x0 72 %x3x3 = mul i8 %x3, %x3 73 %y1y1 = mul i8 %y1, %y1 74 %y2y2 = mul i8 %y2, %y2 75 %ins1 = insertelement <4 x i8> undef, i8 %x0x0, i32 0 76 %ins2 = insertelement <4 x i8> %ins1, i8 %x3x3, i32 1 77 %ins3 = insertelement <4 x i8> %ins2, i8 %y1y1, i32 2 78 %ins4 = insertelement <4 x i8> %ins3, i8 %y2y2, i32 3 79 ret <4 x i8> %ins4 80} 81 82define i8 @i(<4 x i8> %x, <4 x i8> %y) { 83; CHECK-LABEL: @i( 84; CHECK-NEXT: [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0 85; CHECK-NEXT: [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3 86; CHECK-NEXT: [[Y1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 1 87; CHECK-NEXT: [[Y2:%.*]] = extractelement <4 x i8> [[Y]], i32 2 88; CHECK-NEXT: [[X0X0:%.*]] = mul i8 [[X0]], [[X0]] 89; CHECK-NEXT: [[X3X3:%.*]] = mul i8 [[X3]], [[X3]] 90; CHECK-NEXT: [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]] 91; CHECK-NEXT: [[Y2Y2:%.*]] = mul i8 [[Y2]], [[Y2]] 92; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X0X0]], [[X3X3]] 93; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[Y1Y1]], [[Y2Y2]] 94; CHECK-NEXT: [[TMP3:%.*]] = add i8 [[TMP1]], [[TMP2]] 95; CHECK-NEXT: ret i8 [[TMP3]] 96; 97 %x0 = extractelement <4 x i8> %x, i32 0 98 %x3 = extractelement <4 x i8> %x, i32 3 99 %y1 = extractelement <4 x i8> %y, i32 1 100 %y2 = extractelement <4 x i8> %y, i32 2 101 %x0x0 = mul i8 %x0, %x0 102 %x3x3 = mul i8 %x3, %x3 103 %y1y1 = mul i8 %y1, %y1 104 %y2y2 = mul i8 %y2, %y2 105 %1 = add i8 %x0x0, %x3x3 106 %2 = add i8 %y1y1, %y2y2 107 %3 = add i8 %1, %2 108 ret i8 %3 109} 110 111define i8 @j(<4 x i8> %x, <4 x i8> %y) { 112; CHECK-LABEL: @j( 113; CHECK-NEXT: [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0 114; CHECK-NEXT: [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3 115; CHECK-NEXT: [[Y1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 1 116; CHECK-NEXT: [[Y2:%.*]] = extractelement <4 x i8> [[Y]], i32 2 117; CHECK-NEXT: [[X0X0:%.*]] = mul i8 [[X0]], [[X0]] 118; CHECK-NEXT: [[X3X3:%.*]] = mul i8 [[X3]], [[X3]] 119; CHECK-NEXT: [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]] 120; CHECK-NEXT: [[Y2Y2:%.*]] = mul i8 [[Y2]], [[Y2]] 121; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X0X0]], [[X3X3]] 122; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[Y1Y1]], [[Y2Y2]] 123; CHECK-NEXT: [[TMP3:%.*]] = sdiv i8 [[TMP1]], [[TMP2]] 124; CHECK-NEXT: ret i8 [[TMP3]] 125; 126 %x0 = extractelement <4 x i8> %x, i32 0 127 %x3 = extractelement <4 x i8> %x, i32 3 128 %y1 = extractelement <4 x i8> %y, i32 1 129 %y2 = extractelement <4 x i8> %y, i32 2 130 %x0x0 = mul i8 %x0, %x0 131 %x3x3 = mul i8 %x3, %x3 132 %y1y1 = mul i8 %y1, %y1 133 %y2y2 = mul i8 %y2, %y2 134 %1 = add i8 %x0x0, %x3x3 135 %2 = add i8 %y1y1, %y2y2 136 %3 = sdiv i8 %1, %2 137 ret i8 %3 138} 139 140define i8 @k(<4 x i8> %x) { 141; CHECK-LABEL: @k( 142; CHECK-NEXT: [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0 143; CHECK-NEXT: [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3 144; CHECK-NEXT: [[X1:%.*]] = extractelement <4 x i8> [[X]], i32 1 145; CHECK-NEXT: [[X2:%.*]] = extractelement <4 x i8> [[X]], i32 2 146; CHECK-NEXT: [[X0X0:%.*]] = mul i8 [[X0]], [[X0]] 147; CHECK-NEXT: [[X3X3:%.*]] = mul i8 [[X3]], [[X3]] 148; CHECK-NEXT: [[X1X1:%.*]] = mul i8 [[X1]], [[X1]] 149; CHECK-NEXT: [[X2X2:%.*]] = mul i8 [[X2]], [[X2]] 150; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X0X0]], [[X3X3]] 151; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[X1X1]], [[X2X2]] 152; CHECK-NEXT: [[TMP3:%.*]] = sdiv i8 [[TMP1]], [[TMP2]] 153; CHECK-NEXT: ret i8 [[TMP3]] 154; 155 %x0 = extractelement <4 x i8> %x, i32 0 156 %x3 = extractelement <4 x i8> %x, i32 3 157 %x1 = extractelement <4 x i8> %x, i32 1 158 %x2 = extractelement <4 x i8> %x, i32 2 159 %x0x0 = mul i8 %x0, %x0 160 %x3x3 = mul i8 %x3, %x3 161 %x1x1 = mul i8 %x1, %x1 162 %x2x2 = mul i8 %x2, %x2 163 %1 = add i8 %x0x0, %x3x3 164 %2 = add i8 %x1x1, %x2x2 165 %3 = sdiv i8 %1, %2 166 ret i8 %3 167} 168 169define i8 @k_bb(<4 x i8> %x) { 170; CHECK-LABEL: @k_bb( 171; CHECK-NEXT: [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0 172; CHECK-NEXT: br label [[BB1:%.*]] 173; CHECK: bb1: 174; CHECK-NEXT: [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3 175; CHECK-NEXT: [[X1:%.*]] = extractelement <4 x i8> [[X]], i32 1 176; CHECK-NEXT: [[X2:%.*]] = extractelement <4 x i8> [[X]], i32 2 177; CHECK-NEXT: [[X0X0:%.*]] = mul i8 [[X0]], [[X0]] 178; CHECK-NEXT: [[X3X3:%.*]] = mul i8 [[X3]], [[X3]] 179; CHECK-NEXT: [[X1X1:%.*]] = mul i8 [[X1]], [[X1]] 180; CHECK-NEXT: [[X2X2:%.*]] = mul i8 [[X2]], [[X2]] 181; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X0X0]], [[X3X3]] 182; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[X1X1]], [[X2X2]] 183; CHECK-NEXT: [[TMP3:%.*]] = sdiv i8 [[TMP1]], [[TMP2]] 184; CHECK-NEXT: ret i8 [[TMP3]] 185; 186 %x0 = extractelement <4 x i8> %x, i32 0 187 br label %bb1 188bb1: 189 %x3 = extractelement <4 x i8> %x, i32 3 190 %x1 = extractelement <4 x i8> %x, i32 1 191 %x2 = extractelement <4 x i8> %x, i32 2 192 %x0x0 = mul i8 %x0, %x0 193 %x3x3 = mul i8 %x3, %x3 194 %x1x1 = mul i8 %x1, %x1 195 %x2x2 = mul i8 %x2, %x2 196 %1 = add i8 %x0x0, %x3x3 197 %2 = add i8 %x1x1, %x2x2 198 %3 = sdiv i8 %1, %2 199 ret i8 %3 200} 201