brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · f198971 Raw
173 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer,dce -slp-vectorize-non-power-of-2 -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck --check-prefixes=CHECK,NON-POW2 %s3; RUN: opt < %s -passes=slp-vectorizer,dce -slp-vectorize-non-power-of-2=false -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck --check-prefixes=CHECK,POW2-ONLY %s4 5;int foo(char * restrict A, ptr restrict B, float T) {6;  A[0] = (T * B[10] + 4.0);7;  A[1] = (T * B[11] + 5.0);8;  A[2] = (T * B[12] + 6.0);9;}10 11define i32 @foo(ptr noalias nocapture %A, ptr noalias nocapture %B, float %T) {12; CHECK-LABEL: @foo(13; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds float, ptr [[B:%.*]], i64 1014; CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[TMP1]], align 415; CHECK-NEXT:    [[TMP3:%.*]] = fmul float [[TMP2]], [[T:%.*]]16; CHECK-NEXT:    [[TMP4:%.*]] = fpext float [[TMP3]] to double17; CHECK-NEXT:    [[TMP5:%.*]] = fadd double [[TMP4]], 4.000000e+0018; CHECK-NEXT:    [[TMP6:%.*]] = fptosi double [[TMP5]] to i819; CHECK-NEXT:    store i8 [[TMP6]], ptr [[A:%.*]], align 120; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds float, ptr [[B]], i64 1121; CHECK-NEXT:    [[TMP8:%.*]] = load float, ptr [[TMP7]], align 422; CHECK-NEXT:    [[TMP9:%.*]] = fmul float [[TMP8]], [[T]]23; CHECK-NEXT:    [[TMP10:%.*]] = fpext float [[TMP9]] to double24; CHECK-NEXT:    [[TMP11:%.*]] = fadd double [[TMP10]], 5.000000e+0025; CHECK-NEXT:    [[TMP12:%.*]] = fptosi double [[TMP11]] to i826; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 127; CHECK-NEXT:    store i8 [[TMP12]], ptr [[TMP13]], align 128; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds float, ptr [[B]], i64 1229; CHECK-NEXT:    [[TMP15:%.*]] = load float, ptr [[TMP14]], align 430; CHECK-NEXT:    [[TMP16:%.*]] = fmul float [[TMP15]], [[T]]31; CHECK-NEXT:    [[TMP17:%.*]] = fpext float [[TMP16]] to double32; CHECK-NEXT:    [[TMP18:%.*]] = fadd double [[TMP17]], 6.000000e+0033; CHECK-NEXT:    [[TMP19:%.*]] = fptosi double [[TMP18]] to i834; CHECK-NEXT:    [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 235; CHECK-NEXT:    store i8 [[TMP19]], ptr [[TMP20]], align 136; CHECK-NEXT:    ret i32 undef37;38  %1 = getelementptr inbounds float, ptr %B, i64 1039  %2 = load float, ptr %1, align 440  %3 = fmul float %2, %T41  %4 = fpext float %3 to double42  %5 = fadd double %4, 4.000000e+0043  %6 = fptosi double %5 to i844  store i8 %6, ptr %A, align 145  %7 = getelementptr inbounds float, ptr %B, i64 1146  %8 = load float, ptr %7, align 447  %9 = fmul float %8, %T48  %10 = fpext float %9 to double49  %11 = fadd double %10, 5.000000e+0050  %12 = fptosi double %11 to i851  %13 = getelementptr inbounds i8, ptr %A, i64 152  store i8 %12, ptr %13, align 153  %14 = getelementptr inbounds float, ptr %B, i64 1254  %15 = load float, ptr %14, align 455  %16 = fmul float %15, %T56  %17 = fpext float %16 to double57  %18 = fadd double %17, 6.000000e+0058  %19 = fptosi double %18 to i859  %20 = getelementptr inbounds i8, ptr %A, i64 260  store i8 %19, ptr %20, align 161  ret i32 undef62}63 64; PR4189265define void @test_v4f32_v2f32_store(<4 x float> %f, ptr %p){66; CHECK-LABEL: @test_v4f32_v2f32_store(67; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x float> [[F:%.*]], <4 x float> poison, <2 x i32> <i32 0, i32 1>68; CHECK-NEXT:    store <2 x float> [[TMP1]], ptr [[P:%.*]], align 469; CHECK-NEXT:    ret void70;71  %x0 = extractelement <4 x float> %f, i64 072  %x1 = extractelement <4 x float> %f, i64 173  %p1 = getelementptr inbounds float, ptr %p, i64 174  store float %x0, ptr %p, align 475  store float %x1, ptr %p1, align 476  ret void77}78 79define void @test_v4f32_v2f32_splat_store(<4 x float> %f, ptr %p){80; CHECK-LABEL: @test_v4f32_v2f32_splat_store(81; CHECK-NEXT:    [[X0:%.*]] = extractelement <4 x float> [[F:%.*]], i64 082; CHECK-NEXT:    [[P1:%.*]] = getelementptr inbounds float, ptr [[P:%.*]], i64 183; CHECK-NEXT:    store float [[X0]], ptr [[P]], align 484; CHECK-NEXT:    store float [[X0]], ptr [[P1]], align 485; CHECK-NEXT:    ret void86;87  %x0 = extractelement <4 x float> %f, i64 088  %p1 = getelementptr inbounds float, ptr %p, i64 189  store float %x0, ptr %p, align 490  store float %x0, ptr %p1, align 491  ret void92}93 94define void @test_v4f32_v3f32_store(<4 x float> %f, ptr %p){95; NON-POW2-LABEL: @test_v4f32_v3f32_store(96; NON-POW2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x float> [[F:%.*]], <4 x float> poison, <3 x i32> <i32 0, i32 1, i32 2>97; NON-POW2-NEXT:    store <3 x float> [[TMP1]], ptr [[P:%.*]], align 498; NON-POW2-NEXT:    ret void99;100; POW2-ONLY-LABEL: @test_v4f32_v3f32_store(101; POW2-ONLY-NEXT:    [[X2:%.*]] = extractelement <4 x float> [[F:%.*]], i64 2102; POW2-ONLY-NEXT:    [[P2:%.*]] = getelementptr inbounds float, ptr [[P:%.*]], i64 2103; POW2-ONLY-NEXT:    [[TMP1:%.*]] = shufflevector <4 x float> [[F]], <4 x float> poison, <2 x i32> <i32 0, i32 1>104; POW2-ONLY-NEXT:    store <2 x float> [[TMP1]], ptr [[P]], align 4105; POW2-ONLY-NEXT:    store float [[X2]], ptr [[P2]], align 4106; POW2-ONLY-NEXT:    ret void107;108  %x0 = extractelement <4 x float> %f, i64 0109  %x1 = extractelement <4 x float> %f, i64 1110  %x2 = extractelement <4 x float> %f, i64 2111  %p1 = getelementptr inbounds float, ptr %p, i64 1112  %p2 = getelementptr inbounds float, ptr %p, i64 2113  store float %x0, ptr %p, align 4114  store float %x1, ptr %p1, align 4115  store float %x2, ptr %p2, align 4116  ret void117}118 119define void @test_v4f32_v3f32_splat_store(<4 x float> %f, ptr %p){120; CHECK-LABEL: @test_v4f32_v3f32_splat_store(121; CHECK-NEXT:    [[X0:%.*]] = extractelement <4 x float> [[F:%.*]], i64 0122; CHECK-NEXT:    [[P1:%.*]] = getelementptr inbounds float, ptr [[P:%.*]], i64 1123; CHECK-NEXT:    [[P2:%.*]] = getelementptr inbounds float, ptr [[P]], i64 2124; CHECK-NEXT:    store float [[X0]], ptr [[P]], align 4125; CHECK-NEXT:    store float [[X0]], ptr [[P1]], align 4126; CHECK-NEXT:    store float [[X0]], ptr [[P2]], align 4127; CHECK-NEXT:    ret void128;129  %x0 = extractelement <4 x float> %f, i64 0130  %p1 = getelementptr inbounds float, ptr %p, i64 1131  %p2 = getelementptr inbounds float, ptr %p, i64 2132  store float %x0, ptr %p, align 4133  store float %x0, ptr %p1, align 4134  store float %x0, ptr %p2, align 4135  ret void136}137 138define void @test_v4f32_v4f32_store(<4 x float> %f, ptr %p){139; CHECK-LABEL: @test_v4f32_v4f32_store(140; CHECK-NEXT:    store <4 x float> [[F:%.*]], ptr [[P:%.*]], align 4141; CHECK-NEXT:    ret void142;143  %x0 = extractelement <4 x float> %f, i64 0144  %x1 = extractelement <4 x float> %f, i64 1145  %x2 = extractelement <4 x float> %f, i64 2146  %x3 = extractelement <4 x float> %f, i64 3147  %p1 = getelementptr inbounds float, ptr %p, i64 1148  %p2 = getelementptr inbounds float, ptr %p, i64 2149  %p3 = getelementptr inbounds float, ptr %p, i64 3150  store float %x0, ptr %p, align 4151  store float %x1, ptr %p1, align 4152  store float %x2, ptr %p2, align 4153  store float %x3, ptr %p3, align 4154  ret void155}156 157define void @test_v4f32_v4f32_splat_store(<4 x float> %f, ptr %p){158; CHECK-LABEL: @test_v4f32_v4f32_splat_store(159; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x float> [[F:%.*]], <4 x float> poison, <4 x i32> zeroinitializer160; CHECK-NEXT:    store <4 x float> [[TMP1]], ptr [[P:%.*]], align 4161; CHECK-NEXT:    ret void162;163  %x0 = extractelement <4 x float> %f, i64 0164  %p1 = getelementptr inbounds float, ptr %p, i64 1165  %p2 = getelementptr inbounds float, ptr %p, i64 2166  %p3 = getelementptr inbounds float, ptr %p, i64 3167  store float %x0, ptr %p, align 4168  store float %x0, ptr %p1, align 4169  store float %x0, ptr %p2, align 4170  store float %x0, ptr %p3, align 4171  ret void172}173