820 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -S -passes=slp-vectorizer -mtriple=aarch64-unknown-linux -mattr=-fullfp16 | FileCheck %s --check-prefixes=CHECK,NOFP163; RUN: opt < %s -S -passes=slp-vectorizer -mtriple=aarch64-unknown-linux -mattr=+fullfp16 | FileCheck %s --check-prefixes=CHECK,FULLFP164 5define half @reduce_fast_half2(<2 x half> %vec2) {6; NOFP16-LABEL: define half @reduce_fast_half2(7; NOFP16-SAME: <2 x half> [[VEC2:%.*]]) #[[ATTR0:[0-9]+]] {8; NOFP16-NEXT: [[ENTRY:.*:]]9; NOFP16-NEXT: [[ELT0:%.*]] = extractelement <2 x half> [[VEC2]], i64 010; NOFP16-NEXT: [[ELT1:%.*]] = extractelement <2 x half> [[VEC2]], i64 111; NOFP16-NEXT: [[ADD1:%.*]] = fadd fast half [[ELT1]], [[ELT0]]12; NOFP16-NEXT: ret half [[ADD1]]13;14; FULLFP16-LABEL: define half @reduce_fast_half2(15; FULLFP16-SAME: <2 x half> [[VEC2:%.*]]) #[[ATTR0:[0-9]+]] {16; FULLFP16-NEXT: [[ENTRY:.*:]]17; FULLFP16-NEXT: [[TMP0:%.*]] = call fast half @llvm.vector.reduce.fadd.v2f16(half 0xH0000, <2 x half> [[VEC2]])18; FULLFP16-NEXT: ret half [[TMP0]]19;20entry:21 %elt0 = extractelement <2 x half> %vec2, i64 022 %elt1 = extractelement <2 x half> %vec2, i64 123 %add1 = fadd fast half %elt1, %elt024 ret half %add125}26 27define half @reduce_half2(<2 x half> %vec2) {28; CHECK-LABEL: define half @reduce_half2(29; CHECK-SAME: <2 x half> [[VEC2:%.*]]) #[[ATTR0:[0-9]+]] {30; CHECK-NEXT: [[ENTRY:.*:]]31; CHECK-NEXT: [[ELT0:%.*]] = extractelement <2 x half> [[VEC2]], i64 032; CHECK-NEXT: [[ELT1:%.*]] = extractelement <2 x half> [[VEC2]], i64 133; CHECK-NEXT: [[ADD1:%.*]] = fadd half [[ELT1]], [[ELT0]]34; CHECK-NEXT: ret half [[ADD1]]35;36entry:37 %elt0 = extractelement <2 x half> %vec2, i64 038 %elt1 = extractelement <2 x half> %vec2, i64 139 %add1 = fadd half %elt1, %elt040 ret half %add141}42 43define half @reduce_fast_half4(<4 x half> %vec4) {44; CHECK-LABEL: define half @reduce_fast_half4(45; CHECK-SAME: <4 x half> [[VEC4:%.*]]) #[[ATTR0]] {46; CHECK-NEXT: [[ENTRY:.*:]]47; CHECK-NEXT: [[TMP0:%.*]] = call fast half @llvm.vector.reduce.fadd.v4f16(half 0xH0000, <4 x half> [[VEC4]])48; CHECK-NEXT: ret half [[TMP0]]49;50entry:51 %elt0 = extractelement <4 x half> %vec4, i64 052 %elt1 = extractelement <4 x half> %vec4, i64 153 %elt2 = extractelement <4 x half> %vec4, i64 254 %elt3 = extractelement <4 x half> %vec4, i64 355 %add1 = fadd fast half %elt1, %elt056 %add2 = fadd fast half %elt2, %add157 %add3 = fadd fast half %elt3, %add258 ret half %add359}60 61define half @reduce_half4(<4 x half> %vec4) {62; CHECK-LABEL: define half @reduce_half4(63; CHECK-SAME: <4 x half> [[VEC4:%.*]]) #[[ATTR0]] {64; CHECK-NEXT: [[ENTRY:.*:]]65; CHECK-NEXT: [[ELT0:%.*]] = extractelement <4 x half> [[VEC4]], i64 066; CHECK-NEXT: [[ELT1:%.*]] = extractelement <4 x half> [[VEC4]], i64 167; CHECK-NEXT: [[ELT2:%.*]] = extractelement <4 x half> [[VEC4]], i64 268; CHECK-NEXT: [[ELT3:%.*]] = extractelement <4 x half> [[VEC4]], i64 369; CHECK-NEXT: [[ADD1:%.*]] = fadd half [[ELT1]], [[ELT0]]70; CHECK-NEXT: [[ADD2:%.*]] = fadd half [[ELT2]], [[ADD1]]71; CHECK-NEXT: [[ADD3:%.*]] = fadd half [[ELT3]], [[ADD2]]72; CHECK-NEXT: ret half [[ADD3]]73;74entry:75 %elt0 = extractelement <4 x half> %vec4, i64 076 %elt1 = extractelement <4 x half> %vec4, i64 177 %elt2 = extractelement <4 x half> %vec4, i64 278 %elt3 = extractelement <4 x half> %vec4, i64 379 %add1 = fadd half %elt1, %elt080 %add2 = fadd half %elt2, %add181 %add3 = fadd half %elt3, %add282 ret half %add383}84 85define half @reduce_fast_half8(<8 x half> %vec8) {86; NOFP16-LABEL: define half @reduce_fast_half8(87; NOFP16-SAME: <8 x half> [[VEC8:%.*]]) #[[ATTR0]] {88; NOFP16-NEXT: [[ENTRY:.*:]]89; NOFP16-NEXT: [[TMP0:%.*]] = shufflevector <8 x half> [[VEC8]], <8 x half> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>90; NOFP16-NEXT: [[TMP2:%.*]] = shufflevector <8 x half> [[VEC8]], <8 x half> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>91; NOFP16-NEXT: [[RDX_OP:%.*]] = fadd fast <4 x half> [[TMP0]], [[TMP2]]92; NOFP16-NEXT: [[OP_RDX3:%.*]] = call fast half @llvm.vector.reduce.fadd.v4f16(half 0xH0000, <4 x half> [[RDX_OP]])93; NOFP16-NEXT: ret half [[OP_RDX3]]94;95; FULLFP16-LABEL: define half @reduce_fast_half8(96; FULLFP16-SAME: <8 x half> [[VEC8:%.*]]) #[[ATTR0]] {97; FULLFP16-NEXT: [[ENTRY:.*:]]98; FULLFP16-NEXT: [[TMP0:%.*]] = call fast half @llvm.vector.reduce.fadd.v8f16(half 0xH0000, <8 x half> [[VEC8]])99; FULLFP16-NEXT: ret half [[TMP0]]100;101entry:102 %elt0 = extractelement <8 x half> %vec8, i64 0103 %elt1 = extractelement <8 x half> %vec8, i64 1104 %elt2 = extractelement <8 x half> %vec8, i64 2105 %elt3 = extractelement <8 x half> %vec8, i64 3106 %elt4 = extractelement <8 x half> %vec8, i64 4107 %elt5 = extractelement <8 x half> %vec8, i64 5108 %elt6 = extractelement <8 x half> %vec8, i64 6109 %elt7 = extractelement <8 x half> %vec8, i64 7110 %add1 = fadd fast half %elt1, %elt0111 %add2 = fadd fast half %elt2, %add1112 %add3 = fadd fast half %elt3, %add2113 %add4 = fadd fast half %elt4, %add3114 %add5 = fadd fast half %elt5, %add4115 %add6 = fadd fast half %elt6, %add5116 %add7 = fadd fast half %elt7, %add6117 ret half %add7118}119 120define half @reduce_half8(<8 x half> %vec8) {121; CHECK-LABEL: define half @reduce_half8(122; CHECK-SAME: <8 x half> [[VEC8:%.*]]) #[[ATTR0]] {123; CHECK-NEXT: [[ENTRY:.*:]]124; CHECK-NEXT: [[ELT0:%.*]] = extractelement <8 x half> [[VEC8]], i64 0125; CHECK-NEXT: [[ELT1:%.*]] = extractelement <8 x half> [[VEC8]], i64 1126; CHECK-NEXT: [[ELT2:%.*]] = extractelement <8 x half> [[VEC8]], i64 2127; CHECK-NEXT: [[ELT3:%.*]] = extractelement <8 x half> [[VEC8]], i64 3128; CHECK-NEXT: [[ELT4:%.*]] = extractelement <8 x half> [[VEC8]], i64 4129; CHECK-NEXT: [[ELT5:%.*]] = extractelement <8 x half> [[VEC8]], i64 5130; CHECK-NEXT: [[ELT6:%.*]] = extractelement <8 x half> [[VEC8]], i64 6131; CHECK-NEXT: [[ELT7:%.*]] = extractelement <8 x half> [[VEC8]], i64 7132; CHECK-NEXT: [[ADD1:%.*]] = fadd half [[ELT1]], [[ELT0]]133; CHECK-NEXT: [[ADD2:%.*]] = fadd half [[ELT2]], [[ADD1]]134; CHECK-NEXT: [[ADD3:%.*]] = fadd half [[ELT3]], [[ADD2]]135; CHECK-NEXT: [[ADD4:%.*]] = fadd half [[ELT4]], [[ADD3]]136; CHECK-NEXT: [[ADD5:%.*]] = fadd half [[ELT5]], [[ADD4]]137; CHECK-NEXT: [[ADD6:%.*]] = fadd half [[ELT6]], [[ADD5]]138; CHECK-NEXT: [[ADD7:%.*]] = fadd half [[ELT7]], [[ADD6]]139; CHECK-NEXT: ret half [[ADD7]]140;141entry:142 %elt0 = extractelement <8 x half> %vec8, i64 0143 %elt1 = extractelement <8 x half> %vec8, i64 1144 %elt2 = extractelement <8 x half> %vec8, i64 2145 %elt3 = extractelement <8 x half> %vec8, i64 3146 %elt4 = extractelement <8 x half> %vec8, i64 4147 %elt5 = extractelement <8 x half> %vec8, i64 5148 %elt6 = extractelement <8 x half> %vec8, i64 6149 %elt7 = extractelement <8 x half> %vec8, i64 7150 %add1 = fadd half %elt1, %elt0151 %add2 = fadd half %elt2, %add1152 %add3 = fadd half %elt3, %add2153 %add4 = fadd half %elt4, %add3154 %add5 = fadd half %elt5, %add4155 %add6 = fadd half %elt6, %add5156 %add7 = fadd half %elt7, %add6157 ret half %add7158}159 160define half @reduce_fast_half16(<16 x half> %vec16) {161; CHECK-LABEL: define half @reduce_fast_half16(162; CHECK-SAME: <16 x half> [[VEC16:%.*]]) #[[ATTR0]] {163; CHECK-NEXT: [[ENTRY:.*:]]164; CHECK-NEXT: [[TMP0:%.*]] = call fast half @llvm.vector.reduce.fadd.v16f16(half 0xH0000, <16 x half> [[VEC16]])165; CHECK-NEXT: ret half [[TMP0]]166;167entry:168 %elt0 = extractelement <16 x half> %vec16, i64 0169 %elt1 = extractelement <16 x half> %vec16, i64 1170 %elt2 = extractelement <16 x half> %vec16, i64 2171 %elt3 = extractelement <16 x half> %vec16, i64 3172 %elt4 = extractelement <16 x half> %vec16, i64 4173 %elt5 = extractelement <16 x half> %vec16, i64 5174 %elt6 = extractelement <16 x half> %vec16, i64 6175 %elt7 = extractelement <16 x half> %vec16, i64 7176 %elt8 = extractelement <16 x half> %vec16, i64 8177 %elt9 = extractelement <16 x half> %vec16, i64 9178 %elt10 = extractelement <16 x half> %vec16, i64 10179 %elt11 = extractelement <16 x half> %vec16, i64 11180 %elt12 = extractelement <16 x half> %vec16, i64 12181 %elt13 = extractelement <16 x half> %vec16, i64 13182 %elt14 = extractelement <16 x half> %vec16, i64 14183 %elt15 = extractelement <16 x half> %vec16, i64 15184 %add1 = fadd fast half %elt1, %elt0185 %add2 = fadd fast half %elt2, %add1186 %add3 = fadd fast half %elt3, %add2187 %add4 = fadd fast half %elt4, %add3188 %add5 = fadd fast half %elt5, %add4189 %add6 = fadd fast half %elt6, %add5190 %add7 = fadd fast half %elt7, %add6191 %add8 = fadd fast half %elt8, %add7192 %add9 = fadd fast half %elt9, %add8193 %add10 = fadd fast half %elt10, %add9194 %add11 = fadd fast half %elt11, %add10195 %add12 = fadd fast half %elt12, %add11196 %add13 = fadd fast half %elt13, %add12197 %add14 = fadd fast half %elt14, %add13198 %add15 = fadd fast half %elt15, %add14199 ret half %add15200}201 202define half @reduce_half16(<16 x half> %vec16) {203; CHECK-LABEL: define half @reduce_half16(204; CHECK-SAME: <16 x half> [[VEC16:%.*]]) #[[ATTR0]] {205; CHECK-NEXT: [[ENTRY:.*:]]206; CHECK-NEXT: [[ELT0:%.*]] = extractelement <16 x half> [[VEC16]], i64 0207; CHECK-NEXT: [[ELT1:%.*]] = extractelement <16 x half> [[VEC16]], i64 1208; CHECK-NEXT: [[ELT2:%.*]] = extractelement <16 x half> [[VEC16]], i64 2209; CHECK-NEXT: [[ELT3:%.*]] = extractelement <16 x half> [[VEC16]], i64 3210; CHECK-NEXT: [[ELT4:%.*]] = extractelement <16 x half> [[VEC16]], i64 4211; CHECK-NEXT: [[ELT5:%.*]] = extractelement <16 x half> [[VEC16]], i64 5212; CHECK-NEXT: [[ELT6:%.*]] = extractelement <16 x half> [[VEC16]], i64 6213; CHECK-NEXT: [[ELT7:%.*]] = extractelement <16 x half> [[VEC16]], i64 7214; CHECK-NEXT: [[ELT8:%.*]] = extractelement <16 x half> [[VEC16]], i64 8215; CHECK-NEXT: [[ELT9:%.*]] = extractelement <16 x half> [[VEC16]], i64 9216; CHECK-NEXT: [[ELT10:%.*]] = extractelement <16 x half> [[VEC16]], i64 10217; CHECK-NEXT: [[ELT11:%.*]] = extractelement <16 x half> [[VEC16]], i64 11218; CHECK-NEXT: [[ELT12:%.*]] = extractelement <16 x half> [[VEC16]], i64 12219; CHECK-NEXT: [[ELT13:%.*]] = extractelement <16 x half> [[VEC16]], i64 13220; CHECK-NEXT: [[ELT14:%.*]] = extractelement <16 x half> [[VEC16]], i64 14221; CHECK-NEXT: [[ELT15:%.*]] = extractelement <16 x half> [[VEC16]], i64 15222; CHECK-NEXT: [[ADD1:%.*]] = fadd half [[ELT1]], [[ELT0]]223; CHECK-NEXT: [[ADD2:%.*]] = fadd half [[ELT2]], [[ADD1]]224; CHECK-NEXT: [[ADD3:%.*]] = fadd half [[ELT3]], [[ADD2]]225; CHECK-NEXT: [[ADD4:%.*]] = fadd half [[ELT4]], [[ADD3]]226; CHECK-NEXT: [[ADD5:%.*]] = fadd half [[ELT5]], [[ADD4]]227; CHECK-NEXT: [[ADD6:%.*]] = fadd half [[ELT6]], [[ADD5]]228; CHECK-NEXT: [[ADD7:%.*]] = fadd half [[ELT7]], [[ADD6]]229; CHECK-NEXT: [[ADD8:%.*]] = fadd half [[ELT8]], [[ADD7]]230; CHECK-NEXT: [[ADD9:%.*]] = fadd half [[ELT9]], [[ADD8]]231; CHECK-NEXT: [[ADD10:%.*]] = fadd half [[ELT10]], [[ADD9]]232; CHECK-NEXT: [[ADD11:%.*]] = fadd half [[ELT11]], [[ADD10]]233; CHECK-NEXT: [[ADD12:%.*]] = fadd half [[ELT12]], [[ADD11]]234; CHECK-NEXT: [[ADD13:%.*]] = fadd half [[ELT13]], [[ADD12]]235; CHECK-NEXT: [[ADD14:%.*]] = fadd half [[ELT14]], [[ADD13]]236; CHECK-NEXT: [[ADD15:%.*]] = fadd half [[ELT15]], [[ADD14]]237; CHECK-NEXT: ret half [[ADD15]]238;239entry:240 %elt0 = extractelement <16 x half> %vec16, i64 0241 %elt1 = extractelement <16 x half> %vec16, i64 1242 %elt2 = extractelement <16 x half> %vec16, i64 2243 %elt3 = extractelement <16 x half> %vec16, i64 3244 %elt4 = extractelement <16 x half> %vec16, i64 4245 %elt5 = extractelement <16 x half> %vec16, i64 5246 %elt6 = extractelement <16 x half> %vec16, i64 6247 %elt7 = extractelement <16 x half> %vec16, i64 7248 %elt8 = extractelement <16 x half> %vec16, i64 8249 %elt9 = extractelement <16 x half> %vec16, i64 9250 %elt10 = extractelement <16 x half> %vec16, i64 10251 %elt11 = extractelement <16 x half> %vec16, i64 11252 %elt12 = extractelement <16 x half> %vec16, i64 12253 %elt13 = extractelement <16 x half> %vec16, i64 13254 %elt14 = extractelement <16 x half> %vec16, i64 14255 %elt15 = extractelement <16 x half> %vec16, i64 15256 %add1 = fadd half %elt1, %elt0257 %add2 = fadd half %elt2, %add1258 %add3 = fadd half %elt3, %add2259 %add4 = fadd half %elt4, %add3260 %add5 = fadd half %elt5, %add4261 %add6 = fadd half %elt6, %add5262 %add7 = fadd half %elt7, %add6263 %add8 = fadd half %elt8, %add7264 %add9 = fadd half %elt9, %add8265 %add10 = fadd half %elt10, %add9266 %add11 = fadd half %elt11, %add10267 %add12 = fadd half %elt12, %add11268 %add13 = fadd half %elt13, %add12269 %add14 = fadd half %elt14, %add13270 %add15 = fadd half %elt15, %add14271 ret half %add15272}273 274define float @reduce_fast_float2(<2 x float> %vec2) {275; CHECK-LABEL: define float @reduce_fast_float2(276; CHECK-SAME: <2 x float> [[VEC2:%.*]]) #[[ATTR0]] {277; CHECK-NEXT: [[ENTRY:.*:]]278; CHECK-NEXT: [[ADD1:%.*]] = call fast float @llvm.vector.reduce.fadd.v2f32(float 0.000000e+00, <2 x float> [[VEC2]])279; CHECK-NEXT: ret float [[ADD1]]280;281entry:282 %elt0 = extractelement <2 x float> %vec2, i64 0283 %elt1 = extractelement <2 x float> %vec2, i64 1284 %add1 = fadd fast float %elt1, %elt0285 ret float %add1286}287 288define float @reduce_float2(<2 x float> %vec2) {289; CHECK-LABEL: define float @reduce_float2(290; CHECK-SAME: <2 x float> [[VEC2:%.*]]) #[[ATTR0]] {291; CHECK-NEXT: [[ENTRY:.*:]]292; CHECK-NEXT: [[ELT0:%.*]] = extractelement <2 x float> [[VEC2]], i64 0293; CHECK-NEXT: [[ELT1:%.*]] = extractelement <2 x float> [[VEC2]], i64 1294; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[ELT1]], [[ELT0]]295; CHECK-NEXT: ret float [[ADD1]]296;297entry:298 %elt0 = extractelement <2 x float> %vec2, i64 0299 %elt1 = extractelement <2 x float> %vec2, i64 1300 %add1 = fadd float %elt1, %elt0301 ret float %add1302}303 304define float @reduce_fast_float4(<4 x float> %vec4) {305; CHECK-LABEL: define float @reduce_fast_float4(306; CHECK-SAME: <4 x float> [[VEC4:%.*]]) #[[ATTR0]] {307; CHECK-NEXT: [[ENTRY:.*:]]308; CHECK-NEXT: [[TMP0:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[VEC4]])309; CHECK-NEXT: ret float [[TMP0]]310;311entry:312 %elt0 = extractelement <4 x float> %vec4, i64 0313 %elt1 = extractelement <4 x float> %vec4, i64 1314 %elt2 = extractelement <4 x float> %vec4, i64 2315 %elt3 = extractelement <4 x float> %vec4, i64 3316 %add1 = fadd fast float %elt1, %elt0317 %add2 = fadd fast float %elt2, %add1318 %add3 = fadd fast float %elt3, %add2319 ret float %add3320}321 322define float @reduce_float4(<4 x float> %vec4) {323; CHECK-LABEL: define float @reduce_float4(324; CHECK-SAME: <4 x float> [[VEC4:%.*]]) #[[ATTR0]] {325; CHECK-NEXT: [[ENTRY:.*:]]326; CHECK-NEXT: [[ELT0:%.*]] = extractelement <4 x float> [[VEC4]], i64 0327; CHECK-NEXT: [[ELT1:%.*]] = extractelement <4 x float> [[VEC4]], i64 1328; CHECK-NEXT: [[ELT2:%.*]] = extractelement <4 x float> [[VEC4]], i64 2329; CHECK-NEXT: [[ELT3:%.*]] = extractelement <4 x float> [[VEC4]], i64 3330; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[ELT1]], [[ELT0]]331; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[ELT2]], [[ADD1]]332; CHECK-NEXT: [[ADD3:%.*]] = fadd float [[ELT3]], [[ADD2]]333; CHECK-NEXT: ret float [[ADD3]]334;335entry:336 %elt0 = extractelement <4 x float> %vec4, i64 0337 %elt1 = extractelement <4 x float> %vec4, i64 1338 %elt2 = extractelement <4 x float> %vec4, i64 2339 %elt3 = extractelement <4 x float> %vec4, i64 3340 %add1 = fadd float %elt1, %elt0341 %add2 = fadd float %elt2, %add1342 %add3 = fadd float %elt3, %add2343 ret float %add3344}345 346define float @reduce_fast_float8(<8 x float> %vec8) {347; CHECK-LABEL: define float @reduce_fast_float8(348; CHECK-SAME: <8 x float> [[VEC8:%.*]]) #[[ATTR0]] {349; CHECK-NEXT: [[ENTRY:.*:]]350; CHECK-NEXT: [[TMP0:%.*]] = call fast float @llvm.vector.reduce.fadd.v8f32(float 0.000000e+00, <8 x float> [[VEC8]])351; CHECK-NEXT: ret float [[TMP0]]352;353entry:354 %elt0 = extractelement <8 x float> %vec8, i64 0355 %elt1 = extractelement <8 x float> %vec8, i64 1356 %elt2 = extractelement <8 x float> %vec8, i64 2357 %elt3 = extractelement <8 x float> %vec8, i64 3358 %elt4 = extractelement <8 x float> %vec8, i64 4359 %elt5 = extractelement <8 x float> %vec8, i64 5360 %elt6 = extractelement <8 x float> %vec8, i64 6361 %elt7 = extractelement <8 x float> %vec8, i64 7362 %add1 = fadd fast float %elt1, %elt0363 %add2 = fadd fast float %elt2, %add1364 %add3 = fadd fast float %elt3, %add2365 %add4 = fadd fast float %elt4, %add3366 %add5 = fadd fast float %elt5, %add4367 %add6 = fadd fast float %elt6, %add5368 %add7 = fadd fast float %elt7, %add6369 ret float %add7370}371 372define float @reduce_float8(<8 x float> %vec8) {373; CHECK-LABEL: define float @reduce_float8(374; CHECK-SAME: <8 x float> [[VEC8:%.*]]) #[[ATTR0]] {375; CHECK-NEXT: [[ENTRY:.*:]]376; CHECK-NEXT: [[ELT0:%.*]] = extractelement <8 x float> [[VEC8]], i64 0377; CHECK-NEXT: [[ELT1:%.*]] = extractelement <8 x float> [[VEC8]], i64 1378; CHECK-NEXT: [[ELT2:%.*]] = extractelement <8 x float> [[VEC8]], i64 2379; CHECK-NEXT: [[ELT3:%.*]] = extractelement <8 x float> [[VEC8]], i64 3380; CHECK-NEXT: [[ELT4:%.*]] = extractelement <8 x float> [[VEC8]], i64 4381; CHECK-NEXT: [[ELT5:%.*]] = extractelement <8 x float> [[VEC8]], i64 5382; CHECK-NEXT: [[ELT6:%.*]] = extractelement <8 x float> [[VEC8]], i64 6383; CHECK-NEXT: [[ELT7:%.*]] = extractelement <8 x float> [[VEC8]], i64 7384; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[ELT1]], [[ELT0]]385; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[ELT2]], [[ADD1]]386; CHECK-NEXT: [[ADD3:%.*]] = fadd float [[ELT3]], [[ADD2]]387; CHECK-NEXT: [[ADD4:%.*]] = fadd float [[ELT4]], [[ADD3]]388; CHECK-NEXT: [[ADD5:%.*]] = fadd float [[ELT5]], [[ADD4]]389; CHECK-NEXT: [[ADD6:%.*]] = fadd float [[ELT6]], [[ADD5]]390; CHECK-NEXT: [[ADD7:%.*]] = fadd float [[ELT7]], [[ADD6]]391; CHECK-NEXT: ret float [[ADD7]]392;393entry:394 %elt0 = extractelement <8 x float> %vec8, i64 0395 %elt1 = extractelement <8 x float> %vec8, i64 1396 %elt2 = extractelement <8 x float> %vec8, i64 2397 %elt3 = extractelement <8 x float> %vec8, i64 3398 %elt4 = extractelement <8 x float> %vec8, i64 4399 %elt5 = extractelement <8 x float> %vec8, i64 5400 %elt6 = extractelement <8 x float> %vec8, i64 6401 %elt7 = extractelement <8 x float> %vec8, i64 7402 %add1 = fadd float %elt1, %elt0403 %add2 = fadd float %elt2, %add1404 %add3 = fadd float %elt3, %add2405 %add4 = fadd float %elt4, %add3406 %add5 = fadd float %elt5, %add4407 %add6 = fadd float %elt6, %add5408 %add7 = fadd float %elt7, %add6409 ret float %add7410}411 412define double @reduce_fast_double2(<2 x double> %vec2) {413; CHECK-LABEL: define double @reduce_fast_double2(414; CHECK-SAME: <2 x double> [[VEC2:%.*]]) #[[ATTR0]] {415; CHECK-NEXT: [[ENTRY:.*:]]416; CHECK-NEXT: [[ADD1:%.*]] = call fast double @llvm.vector.reduce.fadd.v2f64(double 0.000000e+00, <2 x double> [[VEC2]])417; CHECK-NEXT: ret double [[ADD1]]418;419entry:420 %elt0 = extractelement <2 x double> %vec2, i64 0421 %elt1 = extractelement <2 x double> %vec2, i64 1422 %add1 = fadd fast double %elt1, %elt0423 ret double %add1424}425 426define double @reduce_double2(<2 x double> %vec2) {427; CHECK-LABEL: define double @reduce_double2(428; CHECK-SAME: <2 x double> [[VEC2:%.*]]) #[[ATTR0]] {429; CHECK-NEXT: [[ENTRY:.*:]]430; CHECK-NEXT: [[ELT0:%.*]] = extractelement <2 x double> [[VEC2]], i64 0431; CHECK-NEXT: [[ELT1:%.*]] = extractelement <2 x double> [[VEC2]], i64 1432; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[ELT1]], [[ELT0]]433; CHECK-NEXT: ret double [[ADD1]]434;435entry:436 %elt0 = extractelement <2 x double> %vec2, i64 0437 %elt1 = extractelement <2 x double> %vec2, i64 1438 %add1 = fadd double %elt1, %elt0439 ret double %add1440}441 442define double @reduce_fast_double4(<4 x double> %vec4) {443; CHECK-LABEL: define double @reduce_fast_double4(444; CHECK-SAME: <4 x double> [[VEC4:%.*]]) #[[ATTR0]] {445; CHECK-NEXT: [[ENTRY:.*:]]446; CHECK-NEXT: [[TMP0:%.*]] = call fast double @llvm.vector.reduce.fadd.v4f64(double 0.000000e+00, <4 x double> [[VEC4]])447; CHECK-NEXT: ret double [[TMP0]]448;449entry:450 %elt0 = extractelement <4 x double> %vec4, i64 0451 %elt1 = extractelement <4 x double> %vec4, i64 1452 %elt2 = extractelement <4 x double> %vec4, i64 2453 %elt3 = extractelement <4 x double> %vec4, i64 3454 %add1 = fadd fast double %elt1, %elt0455 %add2 = fadd fast double %elt2, %add1456 %add3 = fadd fast double %elt3, %add2457 ret double %add3458}459 460define double @reduce_double4(<4 x double> %vec4) {461; CHECK-LABEL: define double @reduce_double4(462; CHECK-SAME: <4 x double> [[VEC4:%.*]]) #[[ATTR0]] {463; CHECK-NEXT: [[ENTRY:.*:]]464; CHECK-NEXT: [[ELT0:%.*]] = extractelement <4 x double> [[VEC4]], i64 0465; CHECK-NEXT: [[ELT1:%.*]] = extractelement <4 x double> [[VEC4]], i64 1466; CHECK-NEXT: [[ELT2:%.*]] = extractelement <4 x double> [[VEC4]], i64 2467; CHECK-NEXT: [[ELT3:%.*]] = extractelement <4 x double> [[VEC4]], i64 3468; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[ELT1]], [[ELT0]]469; CHECK-NEXT: [[ADD2:%.*]] = fadd double [[ELT2]], [[ADD1]]470; CHECK-NEXT: [[ADD3:%.*]] = fadd double [[ELT3]], [[ADD2]]471; CHECK-NEXT: ret double [[ADD3]]472;473entry:474 %elt0 = extractelement <4 x double> %vec4, i64 0475 %elt1 = extractelement <4 x double> %vec4, i64 1476 %elt2 = extractelement <4 x double> %vec4, i64 2477 %elt3 = extractelement <4 x double> %vec4, i64 3478 %add1 = fadd double %elt1, %elt0479 %add2 = fadd double %elt2, %add1480 %add3 = fadd double %elt3, %add2481 ret double %add3482}483 484; Fixed iteration count. sum += a[i]485define float @reduce_fast_float_case1(ptr %a) {486; CHECK-LABEL: define float @reduce_fast_float_case1(487; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {488; CHECK-NEXT: [[ENTRY:.*:]]489; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 4490; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 16491; CHECK-NEXT: [[LOAD4:%.*]] = load float, ptr [[GEP4]], align 4492; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[TMP0]])493; CHECK-NEXT: [[ADD4:%.*]] = fadd fast float [[TMP1]], [[LOAD4]]494; CHECK-NEXT: ret float [[ADD4]]495;496entry:497 %load = load float, ptr %a498 %gep = getelementptr inbounds i8, ptr %a, i64 4499 %load1 = load float, ptr %gep500 %add1 = fadd fast float %load1, %load501 %gep2 = getelementptr inbounds i8, ptr %a, i64 8502 %load2 = load float, ptr %gep2503 %add2 = fadd fast float %load2, %add1504 %gep3 = getelementptr inbounds i8, ptr %a, i64 12505 %load3 = load float, ptr %gep3506 %add3 = fadd fast float %load3, %add2507 %gep4 = getelementptr inbounds i8, ptr %a, i64 16508 %load4 = load float, ptr %gep4509 %add4 = fadd fast float %load4, %add3510 ret float %add4511}512 513; Fixed iteration count. sum += a[i]514define float @reduce_float_case1(ptr %a) {515; CHECK-LABEL: define float @reduce_float_case1(516; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {517; CHECK-NEXT: [[ENTRY:.*:]]518; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr [[A]], align 4519; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 4520; CHECK-NEXT: [[LOAD1:%.*]] = load float, ptr [[GEP]], align 4521; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[LOAD1]], [[LOAD]]522; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 8523; CHECK-NEXT: [[LOAD2:%.*]] = load float, ptr [[GEP2]], align 4524; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[LOAD2]], [[ADD1]]525; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 12526; CHECK-NEXT: [[LOAD3:%.*]] = load float, ptr [[GEP3]], align 4527; CHECK-NEXT: [[ADD3:%.*]] = fadd float [[LOAD3]], [[ADD2]]528; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 16529; CHECK-NEXT: [[LOAD4:%.*]] = load float, ptr [[GEP4]], align 4530; CHECK-NEXT: [[ADD4:%.*]] = fadd float [[LOAD4]], [[ADD3]]531; CHECK-NEXT: ret float [[ADD4]]532;533entry:534 %load = load float, ptr %a535 %gep = getelementptr inbounds i8, ptr %a, i64 4536 %load1 = load float, ptr %gep537 %add1 = fadd float %load1, %load538 %gep2 = getelementptr inbounds i8, ptr %a, i64 8539 %load2 = load float, ptr %gep2540 %add2 = fadd float %load2, %add1541 %gep3 = getelementptr inbounds i8, ptr %a, i64 12542 %load3 = load float, ptr %gep3543 %add3 = fadd float %load3, %add2544 %gep4 = getelementptr inbounds i8, ptr %a, i64 16545 %load4 = load float, ptr %gep4546 %add4 = fadd float %load4, %add3547 ret float %add4548}549 550; Reduction needs a shuffle. See add2 and add3.551define float @reduce_fast_float_case2(ptr %a, ptr %b) {552; CHECK-LABEL: define float @reduce_fast_float_case2(553; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {554; CHECK-NEXT: [[ENTRY:.*:]]555; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 4556; CHECK-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr [[B]], align 4557; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[TMP1]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>558; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <4 x float> [[TMP0]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>559; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[TMP1]], <4 x float> [[TMP0]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>560; CHECK-NEXT: [[RED3:%.*]] = call fast float @llvm.vector.reduce.fadd.v8f32(float 0.000000e+00, <8 x float> [[TMP3]])561; CHECK-NEXT: ret float [[RED3]]562;563entry:564 %gepa1 = getelementptr inbounds float, ptr %a, i32 1565 %gepa2 = getelementptr inbounds float, ptr %a, i32 2566 %gepa3 = getelementptr inbounds float, ptr %a, i32 3567 %gepb1 = getelementptr inbounds float, ptr %b, i32 1568 %gepb2 = getelementptr inbounds float, ptr %b, i32 2569 %gepb3 = getelementptr inbounds float, ptr %b, i32 3570 %loada = load float, ptr %a571 %loada1 = load float, ptr %gepa1572 %loada2 = load float, ptr %gepa2573 %loada3 = load float, ptr %gepa3574 %loadb = load float, ptr %b575 %loadb1 = load float, ptr %gepb1576 %loadb2 = load float, ptr %gepb2577 %loadb3 = load float, ptr %gepb3578 %add = fadd fast float %loada, %loadb579 %add1 = fadd fast float %loada1, %loadb1580 %add2 = fadd fast float %loada3, %loadb2581 %add3 = fadd fast float %loada2, %loadb3582 %red1 = fadd fast float %add, %add1583 %red2 = fadd fast float %add2, %red1584 %red3 = fadd fast float %add3, %red2585 ret float %red3586}587 588; Reduction needs a shuffle. See add2 and add3.589define float @reduce_float_case2(ptr %a, ptr %b) {590; CHECK-LABEL: define float @reduce_float_case2(591; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {592; CHECK-NEXT: [[ENTRY:.*:]]593; CHECK-NEXT: [[GEPA2:%.*]] = getelementptr inbounds float, ptr [[A]], i32 2594; CHECK-NEXT: [[GEPA3:%.*]] = getelementptr inbounds float, ptr [[A]], i32 3595; CHECK-NEXT: [[GEPB2:%.*]] = getelementptr inbounds float, ptr [[B]], i32 2596; CHECK-NEXT: [[GEPB3:%.*]] = getelementptr inbounds float, ptr [[B]], i32 3597; CHECK-NEXT: [[LOADA2:%.*]] = load float, ptr [[GEPA2]], align 4598; CHECK-NEXT: [[LOADA3:%.*]] = load float, ptr [[GEPA3]], align 4599; CHECK-NEXT: [[LOADB2:%.*]] = load float, ptr [[GEPB2]], align 4600; CHECK-NEXT: [[LOADB3:%.*]] = load float, ptr [[GEPB3]], align 4601; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[A]], align 4602; CHECK-NEXT: [[TMP1:%.*]] = load <2 x float>, ptr [[B]], align 4603; CHECK-NEXT: [[TMP2:%.*]] = fadd <2 x float> [[TMP0]], [[TMP1]]604; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[LOADA3]], [[LOADB2]]605; CHECK-NEXT: [[ADD3:%.*]] = fadd float [[LOADA2]], [[LOADB3]]606; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x float> [[TMP2]], i32 0607; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x float> [[TMP2]], i32 1608; CHECK-NEXT: [[RED1:%.*]] = fadd float [[TMP3]], [[TMP4]]609; CHECK-NEXT: [[RED2:%.*]] = fadd float [[ADD2]], [[RED1]]610; CHECK-NEXT: [[RED3:%.*]] = fadd float [[ADD3]], [[RED2]]611; CHECK-NEXT: ret float [[RED3]]612;613entry:614 %gepa1 = getelementptr inbounds float, ptr %a, i32 1615 %gepa2 = getelementptr inbounds float, ptr %a, i32 2616 %gepa3 = getelementptr inbounds float, ptr %a, i32 3617 %gepb1 = getelementptr inbounds float, ptr %b, i32 1618 %gepb2 = getelementptr inbounds float, ptr %b, i32 2619 %gepb3 = getelementptr inbounds float, ptr %b, i32 3620 %loada = load float, ptr %a621 %loada1 = load float, ptr %gepa1622 %loada2 = load float, ptr %gepa2623 %loada3 = load float, ptr %gepa3624 %loadb = load float, ptr %b625 %loadb1 = load float, ptr %gepb1626 %loadb2 = load float, ptr %gepb2627 %loadb3 = load float, ptr %gepb3628 %add = fadd float %loada, %loadb629 %add1 = fadd float %loada1, %loadb1630 %add2 = fadd float %loada3, %loadb2631 %add3 = fadd float %loada2, %loadb3632 %red1 = fadd float %add, %add1633 %red2 = fadd float %add2, %red1634 %red3 = fadd float %add3, %red2635 ret float %red3636}637 638; Addition of log.639define float @reduce_fast_float_case3(ptr %a) {640; CHECK-LABEL: define float @reduce_fast_float_case3(641; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {642; CHECK-NEXT: [[ENTRY:.*:]]643; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds float, ptr [[A]], i32 1644; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds float, ptr [[A]], i32 2645; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds float, ptr [[A]], i32 3646; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds float, ptr [[A]], i32 4647; CHECK-NEXT: [[GEP5:%.*]] = getelementptr inbounds float, ptr [[A]], i32 5648; CHECK-NEXT: [[GEP6:%.*]] = getelementptr inbounds float, ptr [[A]], i32 6649; CHECK-NEXT: [[GEP7:%.*]] = getelementptr inbounds float, ptr [[A]], i32 7650; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr [[A]], align 4651; CHECK-NEXT: [[LOAD1:%.*]] = load float, ptr [[GEP1]], align 4652; CHECK-NEXT: [[LOAD2:%.*]] = load float, ptr [[GEP2]], align 4653; CHECK-NEXT: [[LOAD3:%.*]] = load float, ptr [[GEP3]], align 4654; CHECK-NEXT: [[LOAD4:%.*]] = load float, ptr [[GEP4]], align 4655; CHECK-NEXT: [[LOAD5:%.*]] = load float, ptr [[GEP5]], align 4656; CHECK-NEXT: [[LOAD6:%.*]] = load float, ptr [[GEP6]], align 4657; CHECK-NEXT: [[LOAD7:%.*]] = load float, ptr [[GEP7]], align 4658; CHECK-NEXT: [[LOG:%.*]] = call fast float @llvm.log.f32(float [[LOAD]])659; CHECK-NEXT: [[LOG1:%.*]] = call fast float @llvm.log.f32(float [[LOAD1]])660; CHECK-NEXT: [[LOG2:%.*]] = call fast float @llvm.log.f32(float [[LOAD2]])661; CHECK-NEXT: [[LOG3:%.*]] = call fast float @llvm.log.f32(float [[LOAD3]])662; CHECK-NEXT: [[LOG4:%.*]] = call fast float @llvm.log.f32(float [[LOAD4]])663; CHECK-NEXT: [[LOG5:%.*]] = call fast float @llvm.log.f32(float [[LOAD5]])664; CHECK-NEXT: [[LOG6:%.*]] = call fast float @llvm.log.f32(float [[LOAD6]])665; CHECK-NEXT: [[LOG7:%.*]] = call fast float @llvm.log.f32(float [[LOAD7]])666; CHECK-NEXT: [[ADD1:%.*]] = fadd fast float [[LOG]], [[LOG1]]667; CHECK-NEXT: [[ADD2:%.*]] = fadd fast float [[ADD1]], [[LOG2]]668; CHECK-NEXT: [[ADD3:%.*]] = fadd fast float [[ADD2]], [[LOG3]]669; CHECK-NEXT: [[ADD4:%.*]] = fadd fast float [[ADD3]], [[LOG4]]670; CHECK-NEXT: [[ADD5:%.*]] = fadd fast float [[ADD4]], [[LOG5]]671; CHECK-NEXT: [[ADD6:%.*]] = fadd fast float [[ADD5]], [[LOG6]]672; CHECK-NEXT: [[ADD7:%.*]] = fadd fast float [[ADD6]], [[LOG7]]673; CHECK-NEXT: ret float [[ADD7]]674;675entry:676 %gep1 = getelementptr inbounds float, ptr %a, i32 1677 %gep2 = getelementptr inbounds float, ptr %a, i32 2678 %gep3 = getelementptr inbounds float, ptr %a, i32 3679 %gep4 = getelementptr inbounds float, ptr %a, i32 4680 %gep5 = getelementptr inbounds float, ptr %a, i32 5681 %gep6 = getelementptr inbounds float, ptr %a, i32 6682 %gep7 = getelementptr inbounds float, ptr %a, i32 7683 %load = load float, ptr %a684 %load1 = load float, ptr %gep1685 %load2 = load float, ptr %gep2686 %load3 = load float, ptr %gep3687 %load4 = load float, ptr %gep4688 %load5 = load float, ptr %gep5689 %load6 = load float, ptr %gep6690 %load7 = load float, ptr %gep7691 %log = call fast float @llvm.log.f32(float %load)692 %log1 = call fast float @llvm.log.f32(float %load1)693 %log2 = call fast float @llvm.log.f32(float %load2)694 %log3 = call fast float @llvm.log.f32(float %load3)695 %log4 = call fast float @llvm.log.f32(float %load4)696 %log5 = call fast float @llvm.log.f32(float %load5)697 %log6 = call fast float @llvm.log.f32(float %load6)698 %log7 = call fast float @llvm.log.f32(float %load7)699 %add1 = fadd fast float %log, %log1700 %add2 = fadd fast float %add1, %log2701 %add3 = fadd fast float %add2, %log3702 %add4 = fadd fast float %add3, %log4703 %add5 = fadd fast float %add4, %log5704 %add6 = fadd fast float %add5, %log6705 %add7 = fadd fast float %add6, %log7706 ret float %add7707}708 709; Addition of log.710define float @reduce_float_case3(ptr %a) {711; CHECK-LABEL: define float @reduce_float_case3(712; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {713; CHECK-NEXT: [[ENTRY:.*:]]714; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds float, ptr [[A]], i32 1715; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds float, ptr [[A]], i32 2716; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds float, ptr [[A]], i32 3717; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds float, ptr [[A]], i32 4718; CHECK-NEXT: [[GEP5:%.*]] = getelementptr inbounds float, ptr [[A]], i32 5719; CHECK-NEXT: [[GEP6:%.*]] = getelementptr inbounds float, ptr [[A]], i32 6720; CHECK-NEXT: [[GEP7:%.*]] = getelementptr inbounds float, ptr [[A]], i32 7721; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr [[A]], align 4722; CHECK-NEXT: [[LOAD1:%.*]] = load float, ptr [[GEP1]], align 4723; CHECK-NEXT: [[LOAD2:%.*]] = load float, ptr [[GEP2]], align 4724; CHECK-NEXT: [[LOAD3:%.*]] = load float, ptr [[GEP3]], align 4725; CHECK-NEXT: [[LOAD4:%.*]] = load float, ptr [[GEP4]], align 4726; CHECK-NEXT: [[LOAD5:%.*]] = load float, ptr [[GEP5]], align 4727; CHECK-NEXT: [[LOAD6:%.*]] = load float, ptr [[GEP6]], align 4728; CHECK-NEXT: [[LOAD7:%.*]] = load float, ptr [[GEP7]], align 4729; CHECK-NEXT: [[LOG:%.*]] = call float @llvm.log.f32(float [[LOAD]])730; CHECK-NEXT: [[LOG1:%.*]] = call float @llvm.log.f32(float [[LOAD1]])731; CHECK-NEXT: [[LOG2:%.*]] = call float @llvm.log.f32(float [[LOAD2]])732; CHECK-NEXT: [[LOG3:%.*]] = call float @llvm.log.f32(float [[LOAD3]])733; CHECK-NEXT: [[LOG4:%.*]] = call float @llvm.log.f32(float [[LOAD4]])734; CHECK-NEXT: [[LOG5:%.*]] = call float @llvm.log.f32(float [[LOAD5]])735; CHECK-NEXT: [[LOG6:%.*]] = call float @llvm.log.f32(float [[LOAD6]])736; CHECK-NEXT: [[LOG7:%.*]] = call float @llvm.log.f32(float [[LOAD7]])737; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[LOG]], [[LOG1]]738; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[ADD1]], [[LOG2]]739; CHECK-NEXT: [[ADD3:%.*]] = fadd float [[ADD2]], [[LOG3]]740; CHECK-NEXT: [[ADD4:%.*]] = fadd float [[ADD3]], [[LOG4]]741; CHECK-NEXT: [[ADD5:%.*]] = fadd float [[ADD4]], [[LOG5]]742; CHECK-NEXT: [[ADD6:%.*]] = fadd float [[ADD5]], [[LOG6]]743; CHECK-NEXT: [[ADD7:%.*]] = fadd float [[ADD6]], [[LOG7]]744; CHECK-NEXT: ret float [[ADD7]]745;746entry:747 %gep1 = getelementptr inbounds float, ptr %a, i32 1748 %gep2 = getelementptr inbounds float, ptr %a, i32 2749 %gep3 = getelementptr inbounds float, ptr %a, i32 3750 %gep4 = getelementptr inbounds float, ptr %a, i32 4751 %gep5 = getelementptr inbounds float, ptr %a, i32 5752 %gep6 = getelementptr inbounds float, ptr %a, i32 6753 %gep7 = getelementptr inbounds float, ptr %a, i32 7754 %load = load float, ptr %a755 %load1 = load float, ptr %gep1756 %load2 = load float, ptr %gep2757 %load3 = load float, ptr %gep3758 %load4 = load float, ptr %gep4759 %load5 = load float, ptr %gep5760 %load6 = load float, ptr %gep6761 %load7 = load float, ptr %gep7762 %log = call float @llvm.log.f32(float %load)763 %log1 = call float @llvm.log.f32(float %load1)764 %log2 = call float @llvm.log.f32(float %load2)765 %log3 = call float @llvm.log.f32(float %load3)766 %log4 = call float @llvm.log.f32(float %load4)767 %log5 = call float @llvm.log.f32(float %load5)768 %log6 = call float @llvm.log.f32(float %load6)769 %log7 = call float @llvm.log.f32(float %load7)770 %add1 = fadd float %log, %log1771 %add2 = fadd float %add1, %log2772 %add3 = fadd float %add2, %log3773 %add4 = fadd float %add3, %log4774 %add5 = fadd float %add4, %log5775 %add6 = fadd float %add5, %log6776 %add7 = fadd float %add6, %log7777 ret float %add7778}779 780define half @reduce_unordered_fast_half4(<4 x half> %vec4) {781; CHECK-LABEL: define half @reduce_unordered_fast_half4(782; CHECK-SAME: <4 x half> [[VEC4:%.*]]) #[[ATTR0]] {783; CHECK-NEXT: [[ENTRY:.*:]]784; CHECK-NEXT: [[TMP0:%.*]] = call fast half @llvm.vector.reduce.fadd.v4f16(half 0xH0000, <4 x half> [[VEC4]])785; CHECK-NEXT: ret half [[TMP0]]786;787entry:788 %elt0 = extractelement <4 x half> %vec4, i64 0789 %elt1 = extractelement <4 x half> %vec4, i64 1790 %elt2 = extractelement <4 x half> %vec4, i64 2791 %elt3 = extractelement <4 x half> %vec4, i64 3792 %add1 = fadd fast half %elt1, %elt0793 %add2 = fadd fast half %elt2, %elt3794 %add3 = fadd fast half %add1, %add2795 ret half %add3796}797 798define half @reduce_unordered_half4(<4 x half> %vec4) {799; CHECK-LABEL: define half @reduce_unordered_half4(800; CHECK-SAME: <4 x half> [[VEC4:%.*]]) #[[ATTR0]] {801; CHECK-NEXT: [[ENTRY:.*:]]802; CHECK-NEXT: [[TMP0:%.*]] = shufflevector <4 x half> [[VEC4]], <4 x half> poison, <2 x i32> <i32 1, i32 2>803; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x half> [[VEC4]], <4 x half> poison, <2 x i32> <i32 0, i32 3>804; CHECK-NEXT: [[TMP2:%.*]] = fadd <2 x half> [[TMP0]], [[TMP1]]805; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x half> [[TMP2]], i32 0806; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x half> [[TMP2]], i32 1807; CHECK-NEXT: [[ADD3:%.*]] = fadd half [[TMP3]], [[TMP4]]808; CHECK-NEXT: ret half [[ADD3]]809;810entry:811 %elt0 = extractelement <4 x half> %vec4, i64 0812 %elt1 = extractelement <4 x half> %vec4, i64 1813 %elt2 = extractelement <4 x half> %vec4, i64 2814 %elt3 = extractelement <4 x half> %vec4, i64 3815 %add1 = fadd half %elt1, %elt0816 %add2 = fadd half %elt2, %elt3817 %add3 = fadd half %add1, %add2818 ret half %add3819}820