1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -mtriple=aarch64 -passes=slp-vectorizer -mattr=-sve -S < %s | FileCheck %s --check-prefixes=CHECK,NO-SVE 3; RUN: opt -mtriple=aarch64 -passes=slp-vectorizer -mattr=+sve -S < %s | FileCheck %s --check-prefixes=CHECK,SVE 4 5define <2 x i8> @slp_v2i8_Op1_Op2_unknown(<2 x i8> %a, <2 x i8> %b) 6; NO-SVE-LABEL: define <2 x i8> @slp_v2i8_Op1_Op2_unknown( 7; NO-SVE-SAME: <2 x i8> [[A:%.*]], <2 x i8> [[B:%.*]]) #[[ATTR0:[0-9]+]] { 8; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i8> [[A]], i32 0 9; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i8> [[A]], i32 1 10; NO-SVE-NEXT: [[B0:%.*]] = extractelement <2 x i8> [[B]], i32 0 11; NO-SVE-NEXT: [[B1:%.*]] = extractelement <2 x i8> [[B]], i32 1 12; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i8 [[A0]], [[B0]] 13; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i8 [[A1]], [[B1]] 14; NO-SVE-NEXT: [[R0:%.*]] = insertelement <2 x i8> poison, i8 [[TMP1]], i32 0 15; NO-SVE-NEXT: [[R1:%.*]] = insertelement <2 x i8> [[R0]], i8 [[TMP2]], i32 1 16; NO-SVE-NEXT: ret <2 x i8> [[R1]] 17; 18; SVE-LABEL: define <2 x i8> @slp_v2i8_Op1_Op2_unknown( 19; SVE-SAME: <2 x i8> [[A:%.*]], <2 x i8> [[B:%.*]]) #[[ATTR0:[0-9]+]] { 20; SVE-NEXT: [[TMP1:%.*]] = sdiv <2 x i8> [[A]], [[B]] 21; SVE-NEXT: ret <2 x i8> [[TMP1]] 22; 23{ 24 %a0 = extractelement <2 x i8> %a, i32 0 25 %a1 = extractelement <2 x i8> %a, i32 1 26 %b0 = extractelement <2 x i8> %b, i32 0 27 %b1 = extractelement <2 x i8> %b, i32 1 28 %1 = sdiv i8 %a0, %b0 29 %2 = sdiv i8 %a1, %b1 30 %r0 = insertelement <2 x i8> poison, i8 %1, i32 0 31 %r1 = insertelement <2 x i8> %r0, i8 %2, i32 1 32 ret <2 x i8> %r1 33} 34 35define <2 x i16> @slp_v2i16_Op1_Op2_unknown(<2 x i16> %a, <2 x i16> %b) 36; NO-SVE-LABEL: define <2 x i16> @slp_v2i16_Op1_Op2_unknown( 37; NO-SVE-SAME: <2 x i16> [[A:%.*]], <2 x i16> [[B:%.*]]) #[[ATTR0]] { 38; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i16> [[A]], i32 0 39; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i16> [[A]], i32 1 40; NO-SVE-NEXT: [[B0:%.*]] = extractelement <2 x i16> [[B]], i32 0 41; NO-SVE-NEXT: [[B1:%.*]] = extractelement <2 x i16> [[B]], i32 1 42; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i16 [[A0]], [[B0]] 43; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i16 [[A1]], [[B1]] 44; NO-SVE-NEXT: [[R0:%.*]] = insertelement <2 x i16> poison, i16 [[TMP1]], i32 0 45; NO-SVE-NEXT: [[R1:%.*]] = insertelement <2 x i16> [[R0]], i16 [[TMP2]], i32 1 46; NO-SVE-NEXT: ret <2 x i16> [[R1]] 47; 48; SVE-LABEL: define <2 x i16> @slp_v2i16_Op1_Op2_unknown( 49; SVE-SAME: <2 x i16> [[A:%.*]], <2 x i16> [[B:%.*]]) #[[ATTR0]] { 50; SVE-NEXT: [[TMP1:%.*]] = sdiv <2 x i16> [[A]], [[B]] 51; SVE-NEXT: ret <2 x i16> [[TMP1]] 52; 53{ 54 %a0 = extractelement <2 x i16> %a, i32 0 55 %a1 = extractelement <2 x i16> %a, i32 1 56 %b0 = extractelement <2 x i16> %b, i32 0 57 %b1 = extractelement <2 x i16> %b, i32 1 58 %1 = sdiv i16 %a0, %b0 59 %2 = sdiv i16 %a1, %b1 60 %r0 = insertelement <2 x i16> poison, i16 %1, i32 0 61 %r1 = insertelement <2 x i16> %r0, i16 %2, i32 1 62 ret <2 x i16> %r1 63} 64 65define <2 x i32> @slp_v2i32_Op1_Op2_unknown(<2 x i32> %a, <2 x i32> %b) 66; NO-SVE-LABEL: define <2 x i32> @slp_v2i32_Op1_Op2_unknown( 67; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) #[[ATTR0]] { 68; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i32> [[A]], i32 0 69; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i32> [[A]], i32 1 70; NO-SVE-NEXT: [[B0:%.*]] = extractelement <2 x i32> [[B]], i32 0 71; NO-SVE-NEXT: [[B1:%.*]] = extractelement <2 x i32> [[B]], i32 1 72; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i32 [[A0]], [[B0]] 73; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i32 [[A1]], [[B1]] 74; NO-SVE-NEXT: [[R0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP1]], i32 0 75; NO-SVE-NEXT: [[R1:%.*]] = insertelement <2 x i32> [[R0]], i32 [[TMP2]], i32 1 76; NO-SVE-NEXT: ret <2 x i32> [[R1]] 77; 78; SVE-LABEL: define <2 x i32> @slp_v2i32_Op1_Op2_unknown( 79; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) #[[ATTR0]] { 80; SVE-NEXT: [[TMP1:%.*]] = sdiv <2 x i32> [[A]], [[B]] 81; SVE-NEXT: ret <2 x i32> [[TMP1]] 82; 83{ 84 %a0 = extractelement <2 x i32> %a, i32 0 85 %a1 = extractelement <2 x i32> %a, i32 1 86 %b0 = extractelement <2 x i32> %b, i32 0 87 %b1 = extractelement <2 x i32> %b, i32 1 88 %1 = sdiv i32 %a0, %b0 89 %2 = sdiv i32 %a1, %b1 90 %r0 = insertelement <2 x i32> poison, i32 %1, i32 0 91 %r1 = insertelement <2 x i32> %r0, i32 %2, i32 1 92 ret <2 x i32> %r1 93} 94 95define <2 x i64> @slp_v2i64_Op1_Op2_unknown(<2 x i64> %a, <2 x i64> %b) 96; NO-SVE-LABEL: define <2 x i64> @slp_v2i64_Op1_Op2_unknown( 97; NO-SVE-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]]) #[[ATTR0]] { 98; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i64> [[A]], i32 0 99; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i64> [[A]], i32 1 100; NO-SVE-NEXT: [[B0:%.*]] = extractelement <2 x i64> [[B]], i32 0 101; NO-SVE-NEXT: [[B1:%.*]] = extractelement <2 x i64> [[B]], i32 1 102; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i64 [[A0]], [[B0]] 103; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i64 [[A1]], [[B1]] 104; NO-SVE-NEXT: [[R0:%.*]] = insertelement <2 x i64> poison, i64 [[TMP1]], i32 0 105; NO-SVE-NEXT: [[R1:%.*]] = insertelement <2 x i64> [[R0]], i64 [[TMP2]], i32 1 106; NO-SVE-NEXT: ret <2 x i64> [[R1]] 107; 108; SVE-LABEL: define <2 x i64> @slp_v2i64_Op1_Op2_unknown( 109; SVE-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]]) #[[ATTR0]] { 110; SVE-NEXT: [[TMP1:%.*]] = sdiv <2 x i64> [[A]], [[B]] 111; SVE-NEXT: ret <2 x i64> [[TMP1]] 112; 113{ 114 %a0 = extractelement <2 x i64> %a, i32 0 115 %a1 = extractelement <2 x i64> %a, i32 1 116 %b0 = extractelement <2 x i64> %b, i32 0 117 %b1 = extractelement <2 x i64> %b, i32 1 118 %1 = sdiv i64 %a0, %b0 119 %2 = sdiv i64 %a1, %b1 120 %r0 = insertelement <2 x i64> poison, i64 %1, i32 0 121 %r1 = insertelement <2 x i64> %r0, i64 %2, i32 1 122 ret <2 x i64> %r1 123} 124 125define <4 x i8> @slp_v4i8_Op1_Op2_unknown(<4 x i8> %a, <4 x i8> %b) 126; NO-SVE-LABEL: define <4 x i8> @slp_v4i8_Op1_Op2_unknown( 127; NO-SVE-SAME: <4 x i8> [[A:%.*]], <4 x i8> [[B:%.*]]) #[[ATTR0]] { 128; NO-SVE-NEXT: [[A0:%.*]] = extractelement <4 x i8> [[A]], i32 0 129; NO-SVE-NEXT: [[A1:%.*]] = extractelement <4 x i8> [[A]], i32 1 130; NO-SVE-NEXT: [[A2:%.*]] = extractelement <4 x i8> [[A]], i32 2 131; NO-SVE-NEXT: [[A3:%.*]] = extractelement <4 x i8> [[A]], i32 3 132; NO-SVE-NEXT: [[B0:%.*]] = extractelement <4 x i8> [[B]], i32 0 133; NO-SVE-NEXT: [[B1:%.*]] = extractelement <4 x i8> [[B]], i32 1 134; NO-SVE-NEXT: [[B2:%.*]] = extractelement <4 x i8> [[B]], i32 2 135; NO-SVE-NEXT: [[B3:%.*]] = extractelement <4 x i8> [[B]], i32 3 136; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i8 [[A0]], [[B0]] 137; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i8 [[A1]], [[B1]] 138; NO-SVE-NEXT: [[TMP3:%.*]] = sdiv i8 [[A2]], [[B2]] 139; NO-SVE-NEXT: [[TMP4:%.*]] = sdiv i8 [[A3]], [[B3]] 140; NO-SVE-NEXT: [[R0:%.*]] = insertelement <4 x i8> poison, i8 [[TMP1]], i32 0 141; NO-SVE-NEXT: [[R1:%.*]] = insertelement <4 x i8> [[R0]], i8 [[TMP2]], i32 1 142; NO-SVE-NEXT: [[R2:%.*]] = insertelement <4 x i8> [[R1]], i8 [[TMP3]], i32 2 143; NO-SVE-NEXT: [[R3:%.*]] = insertelement <4 x i8> [[R2]], i8 [[TMP4]], i32 3 144; NO-SVE-NEXT: ret <4 x i8> [[R3]] 145; 146; SVE-LABEL: define <4 x i8> @slp_v4i8_Op1_Op2_unknown( 147; SVE-SAME: <4 x i8> [[A:%.*]], <4 x i8> [[B:%.*]]) #[[ATTR0]] { 148; SVE-NEXT: [[TMP1:%.*]] = sdiv <4 x i8> [[A]], [[B]] 149; SVE-NEXT: ret <4 x i8> [[TMP1]] 150; 151{ 152 %a0 = extractelement <4 x i8> %a, i32 0 153 %a1 = extractelement <4 x i8> %a, i32 1 154 %a2 = extractelement <4 x i8> %a, i32 2 155 %a3 = extractelement <4 x i8> %a, i32 3 156 %b0 = extractelement <4 x i8> %b, i32 0 157 %b1 = extractelement <4 x i8> %b, i32 1 158 %b2 = extractelement <4 x i8> %b, i32 2 159 %b3 = extractelement <4 x i8> %b, i32 3 160 %1 = sdiv i8 %a0, %b0 161 %2 = sdiv i8 %a1, %b1 162 %3 = sdiv i8 %a2, %b2 163 %4 = sdiv i8 %a3, %b3 164 %r0 = insertelement <4 x i8> poison, i8 %1, i32 0 165 %r1 = insertelement <4 x i8> %r0, i8 %2, i32 1 166 %r2 = insertelement <4 x i8> %r1, i8 %3, i32 2 167 %r3 = insertelement <4 x i8> %r2, i8 %4, i32 3 168 ret <4 x i8> %r3 169} 170 171define <4 x i16> @slp_v4i16_Op1_Op2_unknown(<4 x i16> %a, <4 x i16> %b) 172; NO-SVE-LABEL: define <4 x i16> @slp_v4i16_Op1_Op2_unknown( 173; NO-SVE-SAME: <4 x i16> [[A:%.*]], <4 x i16> [[B:%.*]]) #[[ATTR0]] { 174; NO-SVE-NEXT: [[A0:%.*]] = extractelement <4 x i16> [[A]], i32 0 175; NO-SVE-NEXT: [[A1:%.*]] = extractelement <4 x i16> [[A]], i32 1 176; NO-SVE-NEXT: [[A2:%.*]] = extractelement <4 x i16> [[A]], i32 2 177; NO-SVE-NEXT: [[A3:%.*]] = extractelement <4 x i16> [[A]], i32 3 178; NO-SVE-NEXT: [[B0:%.*]] = extractelement <4 x i16> [[B]], i32 0 179; NO-SVE-NEXT: [[B1:%.*]] = extractelement <4 x i16> [[B]], i32 1 180; NO-SVE-NEXT: [[B2:%.*]] = extractelement <4 x i16> [[B]], i32 2 181; NO-SVE-NEXT: [[B3:%.*]] = extractelement <4 x i16> [[B]], i32 3 182; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i16 [[A0]], [[B0]] 183; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i16 [[A1]], [[B1]] 184; NO-SVE-NEXT: [[TMP3:%.*]] = sdiv i16 [[A2]], [[B2]] 185; NO-SVE-NEXT: [[TMP4:%.*]] = sdiv i16 [[A3]], [[B3]] 186; NO-SVE-NEXT: [[R0:%.*]] = insertelement <4 x i16> poison, i16 [[TMP1]], i32 0 187; NO-SVE-NEXT: [[R1:%.*]] = insertelement <4 x i16> [[R0]], i16 [[TMP2]], i32 1 188; NO-SVE-NEXT: [[R2:%.*]] = insertelement <4 x i16> [[R1]], i16 [[TMP3]], i32 2 189; NO-SVE-NEXT: [[R3:%.*]] = insertelement <4 x i16> [[R2]], i16 [[TMP4]], i32 3 190; NO-SVE-NEXT: ret <4 x i16> [[R3]] 191; 192; SVE-LABEL: define <4 x i16> @slp_v4i16_Op1_Op2_unknown( 193; SVE-SAME: <4 x i16> [[A:%.*]], <4 x i16> [[B:%.*]]) #[[ATTR0]] { 194; SVE-NEXT: [[TMP1:%.*]] = sdiv <4 x i16> [[A]], [[B]] 195; SVE-NEXT: ret <4 x i16> [[TMP1]] 196; 197{ 198 %a0 = extractelement <4 x i16> %a, i32 0 199 %a1 = extractelement <4 x i16> %a, i32 1 200 %a2 = extractelement <4 x i16> %a, i32 2 201 %a3 = extractelement <4 x i16> %a, i32 3 202 %b0 = extractelement <4 x i16> %b, i32 0 203 %b1 = extractelement <4 x i16> %b, i32 1 204 %b2 = extractelement <4 x i16> %b, i32 2 205 %b3 = extractelement <4 x i16> %b, i32 3 206 %1 = sdiv i16 %a0, %b0 207 %2 = sdiv i16 %a1, %b1 208 %3 = sdiv i16 %a2, %b2 209 %4 = sdiv i16 %a3, %b3 210 %r0 = insertelement <4 x i16> poison, i16 %1, i32 0 211 %r1 = insertelement <4 x i16> %r0, i16 %2, i32 1 212 %r2 = insertelement <4 x i16> %r1, i16 %3, i32 2 213 %r3 = insertelement <4 x i16> %r2, i16 %4, i32 3 214 ret <4 x i16> %r3 215} 216 217define <4 x i32> @slp_v4i32_Op1_Op2_unknown(<4 x i32> %a, <4 x i32> %b) 218; NO-SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_Op2_unknown( 219; NO-SVE-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) #[[ATTR0]] { 220; NO-SVE-NEXT: [[A0:%.*]] = extractelement <4 x i32> [[A]], i32 0 221; NO-SVE-NEXT: [[A1:%.*]] = extractelement <4 x i32> [[A]], i32 1 222; NO-SVE-NEXT: [[A2:%.*]] = extractelement <4 x i32> [[A]], i32 2 223; NO-SVE-NEXT: [[A3:%.*]] = extractelement <4 x i32> [[A]], i32 3 224; NO-SVE-NEXT: [[B0:%.*]] = extractelement <4 x i32> [[B]], i32 0 225; NO-SVE-NEXT: [[B1:%.*]] = extractelement <4 x i32> [[B]], i32 1 226; NO-SVE-NEXT: [[B2:%.*]] = extractelement <4 x i32> [[B]], i32 2 227; NO-SVE-NEXT: [[B3:%.*]] = extractelement <4 x i32> [[B]], i32 3 228; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i32 [[A0]], [[B0]] 229; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i32 [[A1]], [[B1]] 230; NO-SVE-NEXT: [[TMP3:%.*]] = sdiv i32 [[A2]], [[B2]] 231; NO-SVE-NEXT: [[TMP4:%.*]] = sdiv i32 [[A3]], [[B3]] 232; NO-SVE-NEXT: [[R0:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i32 0 233; NO-SVE-NEXT: [[R1:%.*]] = insertelement <4 x i32> [[R0]], i32 [[TMP2]], i32 1 234; NO-SVE-NEXT: [[R2:%.*]] = insertelement <4 x i32> [[R1]], i32 [[TMP3]], i32 2 235; NO-SVE-NEXT: [[R3:%.*]] = insertelement <4 x i32> [[R2]], i32 [[TMP4]], i32 3 236; NO-SVE-NEXT: ret <4 x i32> [[R3]] 237; 238; SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_Op2_unknown( 239; SVE-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) #[[ATTR0]] { 240; SVE-NEXT: [[TMP1:%.*]] = sdiv <4 x i32> [[A]], [[B]] 241; SVE-NEXT: ret <4 x i32> [[TMP1]] 242; 243{ 244 %a0 = extractelement <4 x i32> %a, i32 0 245 %a1 = extractelement <4 x i32> %a, i32 1 246 %a2 = extractelement <4 x i32> %a, i32 2 247 %a3 = extractelement <4 x i32> %a, i32 3 248 %b0 = extractelement <4 x i32> %b, i32 0 249 %b1 = extractelement <4 x i32> %b, i32 1 250 %b2 = extractelement <4 x i32> %b, i32 2 251 %b3 = extractelement <4 x i32> %b, i32 3 252 %1 = sdiv i32 %a0, %b0 253 %2 = sdiv i32 %a1, %b1 254 %3 = sdiv i32 %a2, %b2 255 %4 = sdiv i32 %a3, %b3 256 %r0 = insertelement <4 x i32> poison, i32 %1, i32 0 257 %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1 258 %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2 259 %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3 260 ret <4 x i32> %r3 261} 262 263define <8 x i8> @slp_v8i8_Op1_Op2_unknown(<8 x i8> %a, <8 x i8> %b) 264; NO-SVE-LABEL: define <8 x i8> @slp_v8i8_Op1_Op2_unknown( 265; NO-SVE-SAME: <8 x i8> [[A:%.*]], <8 x i8> [[B:%.*]]) #[[ATTR0]] { 266; NO-SVE-NEXT: [[A0:%.*]] = extractelement <8 x i8> [[A]], i32 0 267; NO-SVE-NEXT: [[A1:%.*]] = extractelement <8 x i8> [[A]], i32 1 268; NO-SVE-NEXT: [[A2:%.*]] = extractelement <8 x i8> [[A]], i32 2 269; NO-SVE-NEXT: [[A3:%.*]] = extractelement <8 x i8> [[A]], i32 3 270; NO-SVE-NEXT: [[A4:%.*]] = extractelement <8 x i8> [[A]], i32 4 271; NO-SVE-NEXT: [[A5:%.*]] = extractelement <8 x i8> [[A]], i32 5 272; NO-SVE-NEXT: [[A6:%.*]] = extractelement <8 x i8> [[A]], i32 6 273; NO-SVE-NEXT: [[A7:%.*]] = extractelement <8 x i8> [[A]], i32 7 274; NO-SVE-NEXT: [[B0:%.*]] = extractelement <8 x i8> [[B]], i32 0 275; NO-SVE-NEXT: [[B1:%.*]] = extractelement <8 x i8> [[B]], i32 1 276; NO-SVE-NEXT: [[B2:%.*]] = extractelement <8 x i8> [[B]], i32 2 277; NO-SVE-NEXT: [[B3:%.*]] = extractelement <8 x i8> [[B]], i32 3 278; NO-SVE-NEXT: [[B4:%.*]] = extractelement <8 x i8> [[B]], i32 4 279; NO-SVE-NEXT: [[B5:%.*]] = extractelement <8 x i8> [[B]], i32 5 280; NO-SVE-NEXT: [[B6:%.*]] = extractelement <8 x i8> [[B]], i32 6 281; NO-SVE-NEXT: [[B7:%.*]] = extractelement <8 x i8> [[B]], i32 7 282; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i8 [[A0]], [[B0]] 283; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i8 [[A1]], [[B1]] 284; NO-SVE-NEXT: [[TMP3:%.*]] = sdiv i8 [[A2]], [[B2]] 285; NO-SVE-NEXT: [[TMP4:%.*]] = sdiv i8 [[A3]], [[B3]] 286; NO-SVE-NEXT: [[TMP5:%.*]] = sdiv i8 [[A4]], [[B4]] 287; NO-SVE-NEXT: [[TMP6:%.*]] = sdiv i8 [[A5]], [[B5]] 288; NO-SVE-NEXT: [[TMP7:%.*]] = sdiv i8 [[A6]], [[B6]] 289; NO-SVE-NEXT: [[TMP8:%.*]] = sdiv i8 [[A7]], [[B7]] 290; NO-SVE-NEXT: [[R0:%.*]] = insertelement <8 x i8> poison, i8 [[TMP1]], i32 0 291; NO-SVE-NEXT: [[R1:%.*]] = insertelement <8 x i8> [[R0]], i8 [[TMP2]], i32 1 292; NO-SVE-NEXT: [[R2:%.*]] = insertelement <8 x i8> [[R1]], i8 [[TMP3]], i32 2 293; NO-SVE-NEXT: [[R3:%.*]] = insertelement <8 x i8> [[R2]], i8 [[TMP4]], i32 3 294; NO-SVE-NEXT: [[R4:%.*]] = insertelement <8 x i8> [[R3]], i8 [[TMP5]], i32 4 295; NO-SVE-NEXT: [[R5:%.*]] = insertelement <8 x i8> [[R4]], i8 [[TMP6]], i32 5 296; NO-SVE-NEXT: [[R6:%.*]] = insertelement <8 x i8> [[R5]], i8 [[TMP7]], i32 6 297; NO-SVE-NEXT: [[R7:%.*]] = insertelement <8 x i8> [[R6]], i8 [[TMP8]], i32 7 298; NO-SVE-NEXT: ret <8 x i8> [[R3]] 299; 300; SVE-LABEL: define <8 x i8> @slp_v8i8_Op1_Op2_unknown( 301; SVE-SAME: <8 x i8> [[A:%.*]], <8 x i8> [[B:%.*]]) #[[ATTR0]] { 302; SVE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 303; SVE-NEXT: [[TMP2:%.*]] = shufflevector <8 x i8> [[B]], <8 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 304; SVE-NEXT: [[TMP3:%.*]] = sdiv <4 x i8> [[TMP1]], [[TMP2]] 305; SVE-NEXT: [[TMP4:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 306; SVE-NEXT: [[TMP5:%.*]] = shufflevector <8 x i8> [[B]], <8 x i8> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 307; SVE-NEXT: [[TMP6:%.*]] = sdiv <4 x i8> [[TMP4]], [[TMP5]] 308; SVE-NEXT: [[TMP7:%.*]] = shufflevector <4 x i8> [[TMP3]], <4 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison> 309; SVE-NEXT: [[TMP8:%.*]] = shufflevector <4 x i8> [[TMP6]], <4 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison> 310; SVE-NEXT: [[R71:%.*]] = shufflevector <8 x i8> [[TMP7]], <8 x i8> [[TMP8]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11> 311; SVE-NEXT: ret <8 x i8> [[TMP7]] 312; 313{ 314 %a0 = extractelement <8 x i8> %a, i32 0 315 %a1 = extractelement <8 x i8> %a, i32 1 316 %a2 = extractelement <8 x i8> %a, i32 2 317 %a3 = extractelement <8 x i8> %a, i32 3 318 %a4 = extractelement <8 x i8> %a, i32 4 319 %a5 = extractelement <8 x i8> %a, i32 5 320 %a6 = extractelement <8 x i8> %a, i32 6 321 %a7 = extractelement <8 x i8> %a, i32 7 322 %b0 = extractelement <8 x i8> %b, i32 0 323 %b1 = extractelement <8 x i8> %b, i32 1 324 %b2 = extractelement <8 x i8> %b, i32 2 325 %b3 = extractelement <8 x i8> %b, i32 3 326 %b4 = extractelement <8 x i8> %b, i32 4 327 %b5 = extractelement <8 x i8> %b, i32 5 328 %b6 = extractelement <8 x i8> %b, i32 6 329 %b7 = extractelement <8 x i8> %b, i32 7 330 %1 = sdiv i8 %a0, %b0 331 %2 = sdiv i8 %a1, %b1 332 %3 = sdiv i8 %a2, %b2 333 %4 = sdiv i8 %a3, %b3 334 %5 = sdiv i8 %a4, %b4 335 %6 = sdiv i8 %a5, %b5 336 %7 = sdiv i8 %a6, %b6 337 %8 = sdiv i8 %a7, %b7 338 %r0 = insertelement <8 x i8> poison, i8 %1, i32 0 339 %r1 = insertelement <8 x i8> %r0, i8 %2, i32 1 340 %r2 = insertelement <8 x i8> %r1, i8 %3, i32 2 341 %r3 = insertelement <8 x i8> %r2, i8 %4, i32 3 342 %r4 = insertelement <8 x i8> %r3, i8 %5, i32 4 343 %r5 = insertelement <8 x i8> %r4, i8 %6, i32 5 344 %r6 = insertelement <8 x i8> %r5, i8 %7, i32 6 345 %r7 = insertelement <8 x i8> %r6, i8 %8, i32 7 346 ret <8 x i8> %r3 347} 348 349define <8 x i16> @slp_v8i16_Op1_Op2_unknown(<8 x i16> %a, <8 x i16> %b) 350; NO-SVE-LABEL: define <8 x i16> @slp_v8i16_Op1_Op2_unknown( 351; NO-SVE-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]]) #[[ATTR0]] { 352; NO-SVE-NEXT: [[A0:%.*]] = extractelement <8 x i16> [[A]], i32 0 353; NO-SVE-NEXT: [[A1:%.*]] = extractelement <8 x i16> [[A]], i32 1 354; NO-SVE-NEXT: [[A2:%.*]] = extractelement <8 x i16> [[A]], i32 2 355; NO-SVE-NEXT: [[A3:%.*]] = extractelement <8 x i16> [[A]], i32 3 356; NO-SVE-NEXT: [[A4:%.*]] = extractelement <8 x i16> [[A]], i32 4 357; NO-SVE-NEXT: [[A5:%.*]] = extractelement <8 x i16> [[A]], i32 5 358; NO-SVE-NEXT: [[A6:%.*]] = extractelement <8 x i16> [[A]], i32 6 359; NO-SVE-NEXT: [[A7:%.*]] = extractelement <8 x i16> [[A]], i32 7 360; NO-SVE-NEXT: [[B0:%.*]] = extractelement <8 x i16> [[B]], i32 0 361; NO-SVE-NEXT: [[B1:%.*]] = extractelement <8 x i16> [[B]], i32 1 362; NO-SVE-NEXT: [[B2:%.*]] = extractelement <8 x i16> [[B]], i32 2 363; NO-SVE-NEXT: [[B3:%.*]] = extractelement <8 x i16> [[B]], i32 3 364; NO-SVE-NEXT: [[B4:%.*]] = extractelement <8 x i16> [[B]], i32 4 365; NO-SVE-NEXT: [[B5:%.*]] = extractelement <8 x i16> [[B]], i32 5 366; NO-SVE-NEXT: [[B6:%.*]] = extractelement <8 x i16> [[B]], i32 6 367; NO-SVE-NEXT: [[B7:%.*]] = extractelement <8 x i16> [[B]], i32 7 368; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i16 [[A0]], [[B0]] 369; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i16 [[A1]], [[B1]] 370; NO-SVE-NEXT: [[TMP3:%.*]] = sdiv i16 [[A2]], [[B2]] 371; NO-SVE-NEXT: [[TMP4:%.*]] = sdiv i16 [[A3]], [[B3]] 372; NO-SVE-NEXT: [[TMP5:%.*]] = sdiv i16 [[A4]], [[B4]] 373; NO-SVE-NEXT: [[TMP6:%.*]] = sdiv i16 [[A5]], [[B5]] 374; NO-SVE-NEXT: [[TMP7:%.*]] = sdiv i16 [[A6]], [[B6]] 375; NO-SVE-NEXT: [[TMP8:%.*]] = sdiv i16 [[A7]], [[B7]] 376; NO-SVE-NEXT: [[R0:%.*]] = insertelement <8 x i16> poison, i16 [[TMP1]], i32 0 377; NO-SVE-NEXT: [[R1:%.*]] = insertelement <8 x i16> [[R0]], i16 [[TMP2]], i32 1 378; NO-SVE-NEXT: [[R2:%.*]] = insertelement <8 x i16> [[R1]], i16 [[TMP3]], i32 2 379; NO-SVE-NEXT: [[R3:%.*]] = insertelement <8 x i16> [[R2]], i16 [[TMP4]], i32 3 380; NO-SVE-NEXT: [[R4:%.*]] = insertelement <8 x i16> [[R3]], i16 [[TMP5]], i32 4 381; NO-SVE-NEXT: [[R5:%.*]] = insertelement <8 x i16> [[R4]], i16 [[TMP6]], i32 5 382; NO-SVE-NEXT: [[R6:%.*]] = insertelement <8 x i16> [[R5]], i16 [[TMP7]], i32 6 383; NO-SVE-NEXT: [[R7:%.*]] = insertelement <8 x i16> [[R6]], i16 [[TMP8]], i32 7 384; NO-SVE-NEXT: ret <8 x i16> [[R3]] 385; 386; SVE-LABEL: define <8 x i16> @slp_v8i16_Op1_Op2_unknown( 387; SVE-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]]) #[[ATTR0]] { 388; SVE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 389; SVE-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[B]], <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 390; SVE-NEXT: [[TMP3:%.*]] = sdiv <4 x i16> [[TMP1]], [[TMP2]] 391; SVE-NEXT: [[TMP4:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 392; SVE-NEXT: [[TMP5:%.*]] = shufflevector <8 x i16> [[B]], <8 x i16> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 393; SVE-NEXT: [[TMP6:%.*]] = sdiv <4 x i16> [[TMP4]], [[TMP5]] 394; SVE-NEXT: [[TMP7:%.*]] = shufflevector <4 x i16> [[TMP3]], <4 x i16> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison> 395; SVE-NEXT: [[TMP8:%.*]] = shufflevector <4 x i16> [[TMP6]], <4 x i16> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison> 396; SVE-NEXT: [[R71:%.*]] = shufflevector <8 x i16> [[TMP7]], <8 x i16> [[TMP8]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11> 397; SVE-NEXT: ret <8 x i16> [[TMP7]] 398; 399{ 400 %a0 = extractelement <8 x i16> %a, i32 0 401 %a1 = extractelement <8 x i16> %a, i32 1 402 %a2 = extractelement <8 x i16> %a, i32 2 403 %a3 = extractelement <8 x i16> %a, i32 3 404 %a4 = extractelement <8 x i16> %a, i32 4 405 %a5 = extractelement <8 x i16> %a, i32 5 406 %a6 = extractelement <8 x i16> %a, i32 6 407 %a7 = extractelement <8 x i16> %a, i32 7 408 %b0 = extractelement <8 x i16> %b, i32 0 409 %b1 = extractelement <8 x i16> %b, i32 1 410 %b2 = extractelement <8 x i16> %b, i32 2 411 %b3 = extractelement <8 x i16> %b, i32 3 412 %b4 = extractelement <8 x i16> %b, i32 4 413 %b5 = extractelement <8 x i16> %b, i32 5 414 %b6 = extractelement <8 x i16> %b, i32 6 415 %b7 = extractelement <8 x i16> %b, i32 7 416 %1 = sdiv i16 %a0, %b0 417 %2 = sdiv i16 %a1, %b1 418 %3 = sdiv i16 %a2, %b2 419 %4 = sdiv i16 %a3, %b3 420 %5 = sdiv i16 %a4, %b4 421 %6 = sdiv i16 %a5, %b5 422 %7 = sdiv i16 %a6, %b6 423 %8 = sdiv i16 %a7, %b7 424 %r0 = insertelement <8 x i16> poison, i16 %1, i32 0 425 %r1 = insertelement <8 x i16> %r0, i16 %2, i32 1 426 %r2 = insertelement <8 x i16> %r1, i16 %3, i32 2 427 %r3 = insertelement <8 x i16> %r2, i16 %4, i32 3 428 %r4 = insertelement <8 x i16> %r3, i16 %5, i32 4 429 %r5 = insertelement <8 x i16> %r4, i16 %6, i32 5 430 %r6 = insertelement <8 x i16> %r5, i16 %7, i32 6 431 %r7 = insertelement <8 x i16> %r6, i16 %8, i32 7 432 ret <8 x i16> %r3 433} 434 435define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const(<4 x i32> %a) 436; NO-SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const( 437; NO-SVE-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] { 438; NO-SVE-NEXT: [[A0:%.*]] = extractelement <4 x i32> [[A]], i32 0 439; NO-SVE-NEXT: [[A1:%.*]] = extractelement <4 x i32> [[A]], i32 1 440; NO-SVE-NEXT: [[A2:%.*]] = extractelement <4 x i32> [[A]], i32 2 441; NO-SVE-NEXT: [[A3:%.*]] = extractelement <4 x i32> [[A]], i32 3 442; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i32 [[A0]], 1 443; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i32 [[A1]], 3 444; NO-SVE-NEXT: [[TMP3:%.*]] = sdiv i32 [[A2]], 5 445; NO-SVE-NEXT: [[TMP4:%.*]] = sdiv i32 [[A3]], 7 446; NO-SVE-NEXT: [[R0:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i32 0 447; NO-SVE-NEXT: [[R1:%.*]] = insertelement <4 x i32> [[R0]], i32 [[TMP2]], i32 1 448; NO-SVE-NEXT: [[R2:%.*]] = insertelement <4 x i32> [[R1]], i32 [[TMP3]], i32 2 449; NO-SVE-NEXT: [[R3:%.*]] = insertelement <4 x i32> [[R2]], i32 [[TMP4]], i32 3 450; NO-SVE-NEXT: ret <4 x i32> [[R3]] 451; 452; SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const( 453; SVE-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] { 454; SVE-NEXT: [[TMP1:%.*]] = sdiv <4 x i32> [[A]], <i32 1, i32 3, i32 5, i32 7> 455; SVE-NEXT: ret <4 x i32> [[TMP1]] 456; 457{ 458 %a0 = extractelement <4 x i32> %a, i32 0 459 %a1 = extractelement <4 x i32> %a, i32 1 460 %a2 = extractelement <4 x i32> %a, i32 2 461 %a3 = extractelement <4 x i32> %a, i32 3 462 %1 = sdiv i32 %a0, 1 463 %2 = sdiv i32 %a1, 3 464 %3 = sdiv i32 %a2, 5 465 %4 = sdiv i32 %a3, 7 466 %r0 = insertelement <4 x i32> poison, i32 %1, i32 0 467 %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1 468 %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2 469 %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3 470 ret <4 x i32> %r3 471} 472 473define <4 x i32> @slp_v4i32_Op1_unknown_Op2_uniform_const(<4 x i32> %a) 474; CHECK-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_uniform_const( 475; CHECK-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0:[0-9]+]] { 476; CHECK-NEXT: [[TMP1:%.*]] = sdiv <4 x i32> [[A]], splat (i32 5) 477; CHECK-NEXT: ret <4 x i32> [[TMP1]] 478; 479{ 480 %a0 = extractelement <4 x i32> %a, i32 0 481 %a1 = extractelement <4 x i32> %a, i32 1 482 %a2 = extractelement <4 x i32> %a, i32 2 483 %a3 = extractelement <4 x i32> %a, i32 3 484 %1 = sdiv i32 %a0, 5 485 %2 = sdiv i32 %a1, 5 486 %3 = sdiv i32 %a2, 5 487 %4 = sdiv i32 %a3, 5 488 %r0 = insertelement <4 x i32> poison, i32 %1, i32 0 489 %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1 490 %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2 491 %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3 492 ret <4 x i32> %r3 493} 494 495define <4 x i32> @slp_v4i32_Op1_unknown_Op2_uniform_const_pow2(<4 x i32> %a) 496; CHECK-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_uniform_const_pow2( 497; CHECK-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] { 498; CHECK-NEXT: [[TMP1:%.*]] = sdiv <4 x i32> [[A]], splat (i32 4) 499; CHECK-NEXT: ret <4 x i32> [[TMP1]] 500; 501{ 502 %a0 = extractelement <4 x i32> %a, i32 0 503 %a1 = extractelement <4 x i32> %a, i32 1 504 %a2 = extractelement <4 x i32> %a, i32 2 505 %a3 = extractelement <4 x i32> %a, i32 3 506 %1 = sdiv i32 %a0, 4 507 %2 = sdiv i32 %a1, 4 508 %3 = sdiv i32 %a2, 4 509 %4 = sdiv i32 %a3, 4 510 %r0 = insertelement <4 x i32> poison, i32 %1, i32 0 511 %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1 512 %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2 513 %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3 514 ret <4 x i32> %r3 515} 516 517define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const_pow2(<4 x i32> %a) 518; NO-SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const_pow2( 519; NO-SVE-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] { 520; NO-SVE-NEXT: [[A0:%.*]] = extractelement <4 x i32> [[A]], i32 0 521; NO-SVE-NEXT: [[A1:%.*]] = extractelement <4 x i32> [[A]], i32 1 522; NO-SVE-NEXT: [[A2:%.*]] = extractelement <4 x i32> [[A]], i32 2 523; NO-SVE-NEXT: [[A3:%.*]] = extractelement <4 x i32> [[A]], i32 3 524; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i32 [[A0]], 1 525; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i32 [[A1]], 2 526; NO-SVE-NEXT: [[TMP3:%.*]] = sdiv i32 [[A2]], 4 527; NO-SVE-NEXT: [[TMP4:%.*]] = sdiv i32 [[A3]], 8 528; NO-SVE-NEXT: [[R0:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i32 0 529; NO-SVE-NEXT: [[R1:%.*]] = insertelement <4 x i32> [[R0]], i32 [[TMP2]], i32 1 530; NO-SVE-NEXT: [[R2:%.*]] = insertelement <4 x i32> [[R1]], i32 [[TMP3]], i32 2 531; NO-SVE-NEXT: [[R3:%.*]] = insertelement <4 x i32> [[R2]], i32 [[TMP4]], i32 3 532; NO-SVE-NEXT: ret <4 x i32> [[R3]] 533; 534; SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const_pow2( 535; SVE-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] { 536; SVE-NEXT: [[TMP1:%.*]] = sdiv <4 x i32> [[A]], <i32 1, i32 2, i32 4, i32 8> 537; SVE-NEXT: ret <4 x i32> [[TMP1]] 538; 539{ 540 %a0 = extractelement <4 x i32> %a, i32 0 541 %a1 = extractelement <4 x i32> %a, i32 1 542 %a2 = extractelement <4 x i32> %a, i32 2 543 %a3 = extractelement <4 x i32> %a, i32 3 544 %1 = sdiv i32 %a0, 1 545 %2 = sdiv i32 %a1, 2 546 %3 = sdiv i32 %a2, 4 547 %4 = sdiv i32 %a3, 8 548 %r0 = insertelement <4 x i32> poison, i32 %1, i32 0 549 %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1 550 %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2 551 %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3 552 ret <4 x i32> %r3 553} 554 555define <2 x i32> @sdiv_v2i32_unknown_divisor(<2 x i32> %a, <2 x i32> %x, <2 x i32> %y, <2 x i32> %z) 556; NO-SVE-LABEL: define <2 x i32> @sdiv_v2i32_unknown_divisor( 557; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] { 558; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i32> [[A]], i64 0 559; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i32> [[A]], i64 1 560; NO-SVE-NEXT: [[X0:%.*]] = extractelement <2 x i32> [[X]], i64 0 561; NO-SVE-NEXT: [[X1:%.*]] = extractelement <2 x i32> [[X]], i64 1 562; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i32 [[A0]], [[X0]] 563; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i32 [[A1]], [[X1]] 564; NO-SVE-NEXT: [[TMP3:%.*]] = add i32 [[TMP1]], [[X0]] 565; NO-SVE-NEXT: [[TMP4:%.*]] = add i32 [[TMP2]], [[X1]] 566; NO-SVE-NEXT: [[Y0:%.*]] = extractelement <2 x i32> [[Y]], i64 0 567; NO-SVE-NEXT: [[Y1:%.*]] = extractelement <2 x i32> [[Y]], i64 1 568; NO-SVE-NEXT: [[TMP5:%.*]] = sub i32 [[TMP3]], [[Y0]] 569; NO-SVE-NEXT: [[TMP6:%.*]] = sub i32 [[TMP4]], [[Y1]] 570; NO-SVE-NEXT: [[Z0:%.*]] = extractelement <2 x i32> [[Z]], i64 0 571; NO-SVE-NEXT: [[Z1:%.*]] = extractelement <2 x i32> [[Z]], i64 1 572; NO-SVE-NEXT: [[TMP7:%.*]] = mul i32 [[TMP5]], [[Z0]] 573; NO-SVE-NEXT: [[TMP8:%.*]] = mul i32 [[TMP6]], [[Z1]] 574; NO-SVE-NEXT: [[RES0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0 575; NO-SVE-NEXT: [[RES1:%.*]] = insertelement <2 x i32> [[RES0]], i32 [[TMP8]], i32 1 576; NO-SVE-NEXT: ret <2 x i32> [[RES1]] 577; 578; SVE-LABEL: define <2 x i32> @sdiv_v2i32_unknown_divisor( 579; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] { 580; SVE-NEXT: [[TMP2:%.*]] = sdiv <2 x i32> [[A]], [[X]] 581; SVE-NEXT: [[TMP3:%.*]] = add <2 x i32> [[TMP2]], [[X]] 582; SVE-NEXT: [[TMP4:%.*]] = sub <2 x i32> [[TMP3]], [[Y]] 583; SVE-NEXT: [[TMP5:%.*]] = mul <2 x i32> [[TMP4]], [[Z]] 584; SVE-NEXT: ret <2 x i32> [[TMP5]] 585; 586{ 587 %a0 = extractelement <2 x i32> %a, i64 0 588 %a1 = extractelement <2 x i32> %a, i64 1 589 %x0 = extractelement <2 x i32> %x, i64 0 590 %x1 = extractelement <2 x i32> %x, i64 1 591 %1 = sdiv i32 %a0, %x0 592 %2 = sdiv i32 %a1, %x1 593 %3 = add i32 %1, %x0 594 %4 = add i32 %2, %x1 595 %y0 = extractelement <2 x i32> %y, i64 0 596 %y1 = extractelement <2 x i32> %y, i64 1 597 %5 = sub i32 %3, %y0 598 %6 = sub i32 %4, %y1 599 %z0 = extractelement <2 x i32> %z, i64 0 600 %z1 = extractelement <2 x i32> %z, i64 1 601 %7 = mul i32 %5, %z0 602 %8 = mul i32 %6, %z1 603 %res0 = insertelement <2 x i32> poison, i32 %7, i32 0 604 %res1 = insertelement <2 x i32> %res0, i32 %8, i32 1 605 ret <2 x i32> %res1 606} 607 608; computes (a/const + x - y) * z 609define <2 x i32> @sdiv_v2i32_const_divisor(<2 x i32> %a, <2 x i32> %x, <2 x i32> %y, <2 x i32> %z) 610; NO-SVE-LABEL: define <2 x i32> @sdiv_v2i32_const_divisor( 611; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] { 612; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i32> [[A]], i64 0 613; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i32> [[A]], i64 1 614; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i32 [[A0]], 2 615; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i32 [[A1]], 4 616; NO-SVE-NEXT: [[X0:%.*]] = extractelement <2 x i32> [[X]], i64 0 617; NO-SVE-NEXT: [[X1:%.*]] = extractelement <2 x i32> [[X]], i64 1 618; NO-SVE-NEXT: [[TMP3:%.*]] = add i32 [[TMP1]], [[X0]] 619; NO-SVE-NEXT: [[TMP4:%.*]] = add i32 [[TMP2]], [[X1]] 620; NO-SVE-NEXT: [[Y0:%.*]] = extractelement <2 x i32> [[Y]], i64 0 621; NO-SVE-NEXT: [[Y1:%.*]] = extractelement <2 x i32> [[Y]], i64 1 622; NO-SVE-NEXT: [[TMP5:%.*]] = sub i32 [[TMP3]], [[Y0]] 623; NO-SVE-NEXT: [[TMP6:%.*]] = sub i32 [[TMP4]], [[Y1]] 624; NO-SVE-NEXT: [[Z0:%.*]] = extractelement <2 x i32> [[Z]], i64 0 625; NO-SVE-NEXT: [[Z1:%.*]] = extractelement <2 x i32> [[Z]], i64 1 626; NO-SVE-NEXT: [[TMP7:%.*]] = mul i32 [[TMP5]], [[Z0]] 627; NO-SVE-NEXT: [[TMP8:%.*]] = mul i32 [[TMP6]], [[Z1]] 628; NO-SVE-NEXT: [[RES0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0 629; NO-SVE-NEXT: [[RES1:%.*]] = insertelement <2 x i32> [[RES0]], i32 [[TMP8]], i32 1 630; NO-SVE-NEXT: ret <2 x i32> [[RES1]] 631; 632; SVE-LABEL: define <2 x i32> @sdiv_v2i32_const_divisor( 633; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] { 634; SVE-NEXT: [[TMP1:%.*]] = sdiv <2 x i32> [[A]], <i32 2, i32 4> 635; SVE-NEXT: [[TMP2:%.*]] = add <2 x i32> [[TMP1]], [[X]] 636; SVE-NEXT: [[TMP3:%.*]] = sub <2 x i32> [[TMP2]], [[Y]] 637; SVE-NEXT: [[TMP4:%.*]] = mul <2 x i32> [[TMP3]], [[Z]] 638; SVE-NEXT: ret <2 x i32> [[TMP4]] 639; 640{ 641 %a0 = extractelement <2 x i32> %a, i64 0 642 %a1 = extractelement <2 x i32> %a, i64 1 643 %1 = sdiv i32 %a0, 2 644 %2 = sdiv i32 %a1, 4 645 %x0 = extractelement <2 x i32> %x, i64 0 646 %x1 = extractelement <2 x i32> %x, i64 1 647 %3 = add i32 %1, %x0 648 %4 = add i32 %2, %x1 649 %y0 = extractelement <2 x i32> %y, i64 0 650 %y1 = extractelement <2 x i32> %y, i64 1 651 %5 = sub i32 %3, %y0 652 %6 = sub i32 %4, %y1 653 %z0 = extractelement <2 x i32> %z, i64 0 654 %z1 = extractelement <2 x i32> %z, i64 1 655 %7 = mul i32 %5, %z0 656 %8 = mul i32 %6, %z1 657 %res0 = insertelement <2 x i32> poison, i32 %7, i32 0 658 %res1 = insertelement <2 x i32> %res0, i32 %8, i32 1 659 ret <2 x i32> %res1 660} 661 662define <2 x i32> @sdiv_v2i32_Op1_unknown_Op2_const(<2 x i32> %a, <2 x i32> %x, <2 x i32> %y, <2 x i32> %z) 663; NO-SVE-LABEL: define <2 x i32> @sdiv_v2i32_Op1_unknown_Op2_const( 664; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] { 665; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i32> [[A]], i64 0 666; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i32> [[A]], i64 1 667; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i32 [[A0]], [[A0]] 668; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i32 [[A1]], 4 669; NO-SVE-NEXT: [[X0:%.*]] = extractelement <2 x i32> [[X]], i64 0 670; NO-SVE-NEXT: [[X1:%.*]] = extractelement <2 x i32> [[X]], i64 1 671; NO-SVE-NEXT: [[TMP3:%.*]] = add i32 [[TMP1]], [[X0]] 672; NO-SVE-NEXT: [[TMP4:%.*]] = add i32 [[TMP2]], [[X1]] 673; NO-SVE-NEXT: [[Y0:%.*]] = extractelement <2 x i32> [[Y]], i64 0 674; NO-SVE-NEXT: [[Y1:%.*]] = extractelement <2 x i32> [[Y]], i64 1 675; NO-SVE-NEXT: [[TMP5:%.*]] = sub i32 [[TMP3]], [[Y0]] 676; NO-SVE-NEXT: [[TMP6:%.*]] = sub i32 [[TMP4]], [[Y1]] 677; NO-SVE-NEXT: [[Z0:%.*]] = extractelement <2 x i32> [[Z]], i64 0 678; NO-SVE-NEXT: [[Z1:%.*]] = extractelement <2 x i32> [[Z]], i64 1 679; NO-SVE-NEXT: [[TMP7:%.*]] = mul i32 [[TMP5]], [[Z0]] 680; NO-SVE-NEXT: [[TMP8:%.*]] = mul i32 [[TMP6]], [[Z1]] 681; NO-SVE-NEXT: [[RES0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0 682; NO-SVE-NEXT: [[RES1:%.*]] = insertelement <2 x i32> [[RES0]], i32 [[TMP8]], i32 1 683; NO-SVE-NEXT: ret <2 x i32> [[RES1]] 684; 685; SVE-LABEL: define <2 x i32> @sdiv_v2i32_Op1_unknown_Op2_const( 686; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] { 687; SVE-NEXT: [[TMP1:%.*]] = shufflevector <2 x i32> [[A]], <2 x i32> <i32 poison, i32 4>, <2 x i32> <i32 0, i32 3> 688; SVE-NEXT: [[TMP2:%.*]] = sdiv <2 x i32> [[A]], [[TMP1]] 689; SVE-NEXT: [[TMP3:%.*]] = add <2 x i32> [[TMP2]], [[X]] 690; SVE-NEXT: [[TMP4:%.*]] = sub <2 x i32> [[TMP3]], [[Y]] 691; SVE-NEXT: [[TMP5:%.*]] = mul <2 x i32> [[TMP4]], [[Z]] 692; SVE-NEXT: ret <2 x i32> [[TMP5]] 693; 694{ 695 %a0 = extractelement <2 x i32> %a, i64 0 696 %a1 = extractelement <2 x i32> %a, i64 1 697 %1 = sdiv i32 %a0, %a0 698 %2 = sdiv i32 %a1, 4 699 %x0 = extractelement <2 x i32> %x, i64 0 700 %x1 = extractelement <2 x i32> %x, i64 1 701 %3 = add i32 %1, %x0 702 %4 = add i32 %2, %x1 703 %y0 = extractelement <2 x i32> %y, i64 0 704 %y1 = extractelement <2 x i32> %y, i64 1 705 %5 = sub i32 %3, %y0 706 %6 = sub i32 %4, %y1 707 %z0 = extractelement <2 x i32> %z, i64 0 708 %z1 = extractelement <2 x i32> %z, i64 1 709 %7 = mul i32 %5, %z0 710 %8 = mul i32 %6, %z1 711 %res0 = insertelement <2 x i32> poison, i32 %7, i32 0 712 %res1 = insertelement <2 x i32> %res0, i32 %8, i32 1 713 ret <2 x i32> %res1 714} 715