249 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 32; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -mcpu=alderlake < %s| FileCheck %s3 4define void @test() {5; CHECK-LABEL: define void @test(6; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {7; CHECK-NEXT: entry:8; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr i32, ptr null, i64 19; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX5]], align 410; CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr i32, ptr null, i64 3311; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX13]], align 412; CHECK-NEXT: [[ARRAYIDX22:%.*]] = getelementptr i32, ptr null, i64 6013; CHECK-NEXT: [[TMP8:%.*]] = call <8 x i32> @llvm.masked.load.v8i32.p0(ptr align 4 null, <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>, <8 x i32> poison)14; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <2 x i32> <i32 0, i32 7>15; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[ARRAYIDX22]], align 416; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i32> poison, i32 [[TMP2]], i32 217; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i32 318; CHECK-NEXT: [[TMP12:%.*]] = shufflevector <2 x i32> [[TMP10]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>19; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> [[TMP12]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>20; CHECK-NEXT: [[TMP3:%.*]] = mul <4 x i32> [[TMP1]], [[TMP7]]21; CHECK-NEXT: [[TMP4:%.*]] = ashr <4 x i32> [[TMP3]], zeroinitializer22; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>23; CHECK-NEXT: store <4 x i32> [[TMP11]], ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 0), align 1624; CHECK-NEXT: ret void25;26entry:27 %arrayidx1 = getelementptr i32, ptr null, i64 128 %0 = load i32, ptr %arrayidx1, align 429 %arrayidx2 = getelementptr i32, ptr null, i64 6330 %1 = load i32, ptr %arrayidx2, align 431 %mul = mul i32 %1, %032 %conv = sext i32 %mul to i6433 %shr = ashr i64 %conv, 034 %conv3 = trunc i64 %shr to i3235 store i32 %conv3, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 0), align 1636 %arrayidx5 = getelementptr i32, ptr null, i64 3337 %2 = load i32, ptr %arrayidx5, align 438 %arrayidx6 = getelementptr i32, ptr null, i64 6239 %3 = load i32, ptr %arrayidx6, align 440 %mul7 = mul i32 %3, %241 %conv8 = sext i32 %mul7 to i6442 %shr10 = ashr i64 %conv8, 043 %conv11 = trunc i64 %shr10 to i3244 store i32 %conv11, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 1), align 445 %arrayidx13 = getelementptr i32, ptr null, i64 746 %4 = load i32, ptr %arrayidx13, align 447 %arrayidx14 = getelementptr i32, ptr null, i64 6148 %5 = load i32, ptr %arrayidx14, align 449 %mul15 = mul i32 %5, %450 %conv16 = sext i32 %mul15 to i6451 %shr18 = ashr i64 %conv16, 052 %conv19 = trunc i64 %shr18 to i3253 store i32 %conv19, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 2), align 854 %6 = load i32, ptr null, align 455 %arrayidx22 = getelementptr i32, ptr null, i64 6056 %7 = load i32, ptr %arrayidx22, align 457 %mul23 = mul i32 %7, %658 %conv24 = sext i32 %mul23 to i6459 %shr26 = ashr i64 %conv24, 060 %conv27 = trunc i64 %shr26 to i3261 store i32 %conv27, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 3), align 462 ret void63}64 65define void @test1() {66; CHECK-LABEL: define void @test1(67; CHECK-SAME: ) #[[ATTR0]] {68; CHECK-NEXT: entry:69; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr i32, ptr null, i64 170; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX5]], align 471; CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr i32, ptr null, i64 3372; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX13]], align 473; CHECK-NEXT: [[ARRAYIDX22:%.*]] = getelementptr i32, ptr null, i64 6074; CHECK-NEXT: [[TMP8:%.*]] = call <8 x i32> @llvm.masked.load.v8i32.p0(ptr align 4 null, <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>, <8 x i32> poison)75; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <2 x i32> <i32 0, i32 7>76; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[ARRAYIDX22]], align 477; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x i32> poison, i32 [[TMP2]], i32 278; CHECK-NEXT: [[TMP12:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP9]], i32 379; CHECK-NEXT: [[TMP14:%.*]] = shufflevector <2 x i32> [[TMP10]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>80; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP12]], <4 x i32> [[TMP14]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>81; CHECK-NEXT: [[TMP3:%.*]] = mul <4 x i32> [[TMP1]], [[TMP7]]82; CHECK-NEXT: [[TMP4:%.*]] = sext <4 x i32> [[TMP3]] to <4 x i64>83; CHECK-NEXT: [[TMP5:%.*]] = lshr <4 x i64> [[TMP4]], zeroinitializer84; CHECK-NEXT: [[TMP6:%.*]] = trunc <4 x i64> [[TMP5]] to <4 x i32>85; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>86; CHECK-NEXT: store <4 x i32> [[TMP13]], ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 0), align 1687; CHECK-NEXT: ret void88;89entry:90 %arrayidx1 = getelementptr i32, ptr null, i64 191 %0 = load i32, ptr %arrayidx1, align 492 %arrayidx2 = getelementptr i32, ptr null, i64 6393 %1 = load i32, ptr %arrayidx2, align 494 %mul = mul i32 %1, %095 %conv = sext i32 %mul to i6496 %shr = lshr i64 %conv, 097 %conv3 = trunc i64 %shr to i3298 store i32 %conv3, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 0), align 1699 %arrayidx5 = getelementptr i32, ptr null, i64 33100 %2 = load i32, ptr %arrayidx5, align 4101 %arrayidx6 = getelementptr i32, ptr null, i64 62102 %3 = load i32, ptr %arrayidx6, align 4103 %mul7 = mul i32 %3, %2104 %conv8 = sext i32 %mul7 to i64105 %shr10 = lshr i64 %conv8, 0106 %conv11 = trunc i64 %shr10 to i32107 store i32 %conv11, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 1), align 4108 %arrayidx13 = getelementptr i32, ptr null, i64 7109 %4 = load i32, ptr %arrayidx13, align 4110 %arrayidx14 = getelementptr i32, ptr null, i64 61111 %5 = load i32, ptr %arrayidx14, align 4112 %mul15 = mul i32 %5, %4113 %conv16 = sext i32 %mul15 to i64114 %shr18 = lshr i64 %conv16, 0115 %conv19 = trunc i64 %shr18 to i32116 store i32 %conv19, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 2), align 8117 %6 = load i32, ptr null, align 4118 %arrayidx22 = getelementptr i32, ptr null, i64 60119 %7 = load i32, ptr %arrayidx22, align 4120 %mul23 = mul i32 %7, %6121 %conv24 = sext i32 %mul23 to i64122 %shr26 = lshr i64 %conv24, 0123 %conv27 = trunc i64 %shr26 to i32124 store i32 %conv27, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 3), align 4125 ret void126}127 128define void @test_div() {129; CHECK-LABEL: define void @test_div(130; CHECK-SAME: ) #[[ATTR0]] {131; CHECK-NEXT: entry:132; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr i32, ptr null, i64 1133; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4134; CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr i32, ptr null, i64 33135; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX13]], align 4136; CHECK-NEXT: [[ARRAYIDX22:%.*]] = getelementptr i32, ptr null, i64 60137; CHECK-NEXT: [[TMP8:%.*]] = call <8 x i32> @llvm.masked.load.v8i32.p0(ptr align 4 null, <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>, <8 x i32> poison)138; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <2 x i32> <i32 0, i32 7>139; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[ARRAYIDX22]], align 4140; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i32> poison, i32 [[TMP2]], i32 2141; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP4]], i32 3142; CHECK-NEXT: [[TMP12:%.*]] = shufflevector <2 x i32> [[TMP3]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>143; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP11]], <4 x i32> [[TMP12]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>144; CHECK-NEXT: [[TMP9:%.*]] = mul <4 x i32> [[TMP1]], [[TMP7]]145; CHECK-NEXT: [[TMP10:%.*]] = udiv <4 x i32> [[TMP9]], <i32 2, i32 1, i32 2, i32 1>146; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <4 x i32> [[TMP10]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>147; CHECK-NEXT: store <4 x i32> [[TMP6]], ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 0), align 16148; CHECK-NEXT: ret void149;150entry:151 %arrayidx1 = getelementptr i32, ptr null, i64 1152 %0 = load i32, ptr %arrayidx1, align 4153 %arrayidx2 = getelementptr i32, ptr null, i64 63154 %1 = load i32, ptr %arrayidx2, align 4155 %mul = mul i32 %1, %0156 %conv = zext i32 %mul to i64157 %shr = udiv i64 %conv, 1158 %conv3 = trunc i64 %shr to i32159 store i32 %conv3, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 0), align 16160 %arrayidx5 = getelementptr i32, ptr null, i64 33161 %2 = load i32, ptr %arrayidx5, align 4162 %arrayidx6 = getelementptr i32, ptr null, i64 62163 %3 = load i32, ptr %arrayidx6, align 4164 %mul7 = mul i32 %3, %2165 %conv8 = zext i32 %mul7 to i64166 %shr10 = udiv i64 %conv8, 2167 %conv11 = trunc i64 %shr10 to i32168 store i32 %conv11, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 1), align 4169 %arrayidx13 = getelementptr i32, ptr null, i64 7170 %4 = load i32, ptr %arrayidx13, align 4171 %arrayidx14 = getelementptr i32, ptr null, i64 61172 %5 = load i32, ptr %arrayidx14, align 4173 %mul15 = mul i32 %5, %4174 %conv16 = zext i32 %mul15 to i64175 %shr18 = udiv i64 %conv16, 1176 %conv19 = trunc i64 %shr18 to i32177 store i32 %conv19, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 2), align 8178 %6 = load i32, ptr null, align 4179 %arrayidx22 = getelementptr i32, ptr null, i64 60180 %7 = load i32, ptr %arrayidx22, align 4181 %mul23 = mul i32 %7, %6182 %conv24 = zext i32 %mul23 to i64183 %shr26 = udiv i64 %conv24, 2184 %conv27 = trunc i64 %shr26 to i32185 store i32 %conv27, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 3), align 4186 ret void187}188 189define void @test_rem() {190; CHECK-LABEL: define void @test_rem(191; CHECK-SAME: ) #[[ATTR0]] {192; CHECK-NEXT: entry:193; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr i32, ptr null, i64 1194; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4195; CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr i32, ptr null, i64 33196; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX13]], align 4197; CHECK-NEXT: [[ARRAYIDX22:%.*]] = getelementptr i32, ptr null, i64 60198; CHECK-NEXT: [[TMP8:%.*]] = call <8 x i32> @llvm.masked.load.v8i32.p0(ptr align 4 null, <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>, <8 x i32> poison)199; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <2 x i32> <i32 0, i32 7>200; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[ARRAYIDX22]], align 4201; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i32> poison, i32 [[TMP2]], i32 2202; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP4]], i32 3203; CHECK-NEXT: [[TMP12:%.*]] = shufflevector <2 x i32> [[TMP3]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>204; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP11]], <4 x i32> [[TMP12]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>205; CHECK-NEXT: [[TMP9:%.*]] = mul <4 x i32> [[TMP1]], [[TMP7]]206; CHECK-NEXT: [[TMP10:%.*]] = urem <4 x i32> [[TMP9]], <i32 1, i32 1, i32 2, i32 1>207; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <4 x i32> [[TMP10]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>208; CHECK-NEXT: store <4 x i32> [[TMP6]], ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 0), align 16209; CHECK-NEXT: ret void210;211entry:212 %arrayidx1 = getelementptr i32, ptr null, i64 1213 %0 = load i32, ptr %arrayidx1, align 4214 %arrayidx2 = getelementptr i32, ptr null, i64 63215 %1 = load i32, ptr %arrayidx2, align 4216 %mul = mul i32 %1, %0217 %conv = zext i32 %mul to i64218 %shr = urem i64 %conv, 1219 %conv3 = trunc i64 %shr to i32220 store i32 %conv3, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 0), align 16221 %arrayidx5 = getelementptr i32, ptr null, i64 33222 %2 = load i32, ptr %arrayidx5, align 4223 %arrayidx6 = getelementptr i32, ptr null, i64 62224 %3 = load i32, ptr %arrayidx6, align 4225 %mul7 = mul i32 %3, %2226 %conv8 = zext i32 %mul7 to i64227 %shr10 = urem i64 %conv8, 2228 %conv11 = trunc i64 %shr10 to i32229 store i32 %conv11, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 1), align 4230 %arrayidx13 = getelementptr i32, ptr null, i64 7231 %4 = load i32, ptr %arrayidx13, align 4232 %arrayidx14 = getelementptr i32, ptr null, i64 61233 %5 = load i32, ptr %arrayidx14, align 4234 %mul15 = mul i32 %5, %4235 %conv16 = zext i32 %mul15 to i64236 %shr18 = urem i64 %conv16, 1237 %conv19 = trunc i64 %shr18 to i32238 store i32 %conv19, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 2), align 8239 %6 = load i32, ptr null, align 4240 %arrayidx22 = getelementptr i32, ptr null, i64 60241 %7 = load i32, ptr %arrayidx22, align 4242 %mul23 = mul i32 %7, %6243 %conv24 = zext i32 %mul23 to i64244 %shr26 = urem i64 %conv24, 1245 %conv27 = trunc i64 %shr26 to i32246 store i32 %conv27, ptr getelementptr inbounds ([4 x i32], ptr null, i64 8, i64 3), align 4247 ret void248}249