brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.7 KiB · 0e3d799 Raw
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