| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes=slp-vectorizer -S -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s |
| |
| define { double, double } @test1(ptr %0, double %.unpack753, double %factor828) { |
| ; CHECK-LABEL: define { double, double } @test1( |
| ; CHECK-SAME: ptr [[TMP0:%.*]], double [[DOTUNPACK753:%.*]], double [[FACTOR828:%.*]]) { |
| ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x double>, ptr [[TMP0]], align 8 |
| ; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x double> <double poison, double 1.000000e+00>, double [[DOTUNPACK753]], i64 0 |
| ; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <2 x double> [[TMP2]], <2 x double> poison, <2 x i32> zeroinitializer |
| ; CHECK-NEXT: [[TMP5:%.*]] = fmul <2 x double> [[TMP3]], [[TMP4]] |
| ; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <2 x double> [[TMP2]], <2 x double> <double 0.000000e+00, double poison>, <2 x i32> <i32 2, i32 0> |
| ; CHECK-NEXT: [[TMP7:%.*]] = fmul <2 x double> [[TMP5]], [[TMP6]] |
| ; CHECK-NEXT: [[TMP8:%.*]] = fmul <2 x double> [[TMP7]], zeroinitializer |
| ; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <2 x double> [[TMP7]], <2 x double> [[TMP5]], <2 x i32> <i32 1, i32 2> |
| ; CHECK-NEXT: [[TMP10:%.*]] = insertelement <2 x double> <double poison, double f0xC1502A98AE76C8B4>, double [[FACTOR828]], i64 0 |
| ; CHECK-NEXT: [[TMP11:%.*]] = fmul <2 x double> [[TMP9]], [[TMP10]] |
| ; CHECK-NEXT: [[TMP12:%.*]] = fadd contract <2 x double> [[TMP11]], zeroinitializer |
| ; CHECK-NEXT: [[TMP13:%.*]] = fmul <2 x double> [[TMP12]], zeroinitializer |
| ; CHECK-NEXT: [[TMP14:%.*]] = fsub <2 x double> zeroinitializer, [[TMP13]] |
| ; CHECK-NEXT: [[TMP15:%.*]] = shufflevector <2 x double> [[TMP7]], <2 x double> poison, <2 x i32> zeroinitializer |
| ; CHECK-NEXT: [[TMP16:%.*]] = fmul <2 x double> [[TMP14]], [[TMP15]] |
| ; CHECK-NEXT: [[TMP17:%.*]] = shufflevector <2 x double> [[TMP16]], <2 x double> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 1> |
| ; CHECK-NEXT: [[TMP18:%.*]] = shufflevector <2 x double> [[TMP16]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP19:%.*]] = shufflevector <4 x double> [[TMP18]], <4 x double> <double 0.000000e+00, double poison, double 0.000000e+00, double poison>, <4 x i32> <i32 4, i32 0, i32 6, i32 1> |
| ; CHECK-NEXT: [[TMP20:%.*]] = shufflevector <2 x double> [[TMP8]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP21:%.*]] = shufflevector <4 x double> <double poison, double poison, double -0.000000e+00, double poison>, <4 x double> [[TMP20]], <4 x i32> <i32 4, i32 5, i32 2, i32 poison> |
| ; CHECK-NEXT: [[TMP22:%.*]] = shufflevector <4 x double> [[TMP21]], <4 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 1> |
| ; CHECK-NEXT: [[TMP23:%.*]] = fadd contract <4 x double> [[TMP19]], [[TMP22]] |
| ; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x double> <double poison, double 1.000000e+00, double poison, double poison>, double [[DOTUNPACK753]], i64 0 |
| ; CHECK-NEXT: [[TMP25:%.*]] = shufflevector <4 x double> [[TMP24]], <4 x double> poison, <4 x i32> <i32 0, i32 0, i32 1, i32 0> |
| ; CHECK-NEXT: [[TMP26:%.*]] = fmul <4 x double> [[TMP23]], [[TMP25]] |
| ; CHECK-NEXT: [[TMP27:%.*]] = shufflevector <4 x double> [[TMP24]], <4 x double> <double 0.000000e+00, double poison, double poison, double poison>, <4 x i32> <i32 4, i32 0, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP28:%.*]] = shufflevector <2 x double> [[TMP2]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP29:%.*]] = shufflevector <4 x double> [[TMP27]], <4 x double> [[TMP28]], <4 x i32> <i32 0, i32 1, i32 4, i32 5> |
| ; CHECK-NEXT: [[TMP30:%.*]] = fadd <4 x double> [[TMP29]], [[TMP26]] |
| ; CHECK-NEXT: [[TMP31:%.*]] = extractelement <4 x double> [[TMP30]], i64 0 |
| ; CHECK-NEXT: [[TMP32:%.*]] = call { double, double } @__divdc3(double [[TMP31]]) |
| ; CHECK-NEXT: call void @llvm.stackrestore.p0(ptr null) |
| ; CHECK-NEXT: [[TMP33:%.*]] = extractelement <4 x double> [[TMP30]], i64 1 |
| ; CHECK-NEXT: [[TMP34:%.*]] = call { double, double } @__divdc3(double [[TMP33]]) |
| ; CHECK-NEXT: [[TMP35:%.*]] = extractelement <4 x double> [[TMP30]], i64 2 |
| ; CHECK-NEXT: [[TMP36:%.*]] = call { double, double } @__divdc3(double [[TMP35]]) |
| ; CHECK-NEXT: [[TMP37:%.*]] = extractelement <4 x double> [[TMP30]], i64 3 |
| ; CHECK-NEXT: [[TMP38:%.*]] = call { double, double } @__divdc3(double [[TMP37]]) |
| ; CHECK-NEXT: ret { double, double } [[TMP38]] |
| ; |
| %.elt752 = getelementptr i8, ptr %0, i64 8 |
| %.unpack7532 = load double, ptr %.elt752, align 8 |
| %.unpack1 = load double, ptr %0, align 8 |
| %2 = fmul double %.unpack753, %.unpack1 |
| %factor8283 = fmul double %2, 0.000000e+00 |
| %3 = fmul double %factor8283, 0.000000e+00 |
| %4 = fadd contract double %3, 0.000000e+00 |
| %5 = fmul double %4, %.unpack753 |
| %6 = fadd contract double %5, 0.000000e+00 |
| %7 = call { double, double } @__divdc3(double %6) |
| %8 = fmul double %.unpack1, %.unpack1 |
| %9 = fmul double %8, %factor828 |
| %10 = fadd contract double %9, 0.000000e+00 |
| %11 = fmul double %10, 0.000000e+00 |
| call void @llvm.stackrestore.p0(ptr null) |
| %12 = fsub double 0.000000e+00, %11 |
| %13 = fmul double %12, %factor8283 |
| %14 = fmul double %8, 0.000000e+00 |
| %15 = fadd contract double %13, %14 |
| %16 = fmul double %15, %.unpack753 |
| %17 = fadd double %.unpack753, %16 |
| %18 = call { double, double } @__divdc3(double %17) |
| %19 = fadd double %.unpack1, 0.000000e+00 |
| %20 = call { double, double } @__divdc3(double %19) |
| %21 = fmul double %2, f0xC1502A98AE76C8B4 |
| %22 = fadd contract double %21, 0.000000e+00 |
| %23 = fmul double %22, 0.000000e+00 |
| %24 = fsub double 0.000000e+00, %23 |
| %25 = fmul double %24, %factor8283 |
| %26 = fadd contract double %25, %14 |
| %27 = fmul double %26, %.unpack753 |
| %28 = fadd double %.unpack7532, %27 |
| %29 = call { double, double } @__divdc3(double %28) |
| ret { double, double } %29 |
| } |
| |
| define { double, double } @test2(ptr %0, double %.unpack) { |
| ; CHECK-LABEL: define { double, double } @test2( |
| ; CHECK-SAME: ptr [[TMP0:%.*]], double [[DOTUNPACK:%.*]]) { |
| ; CHECK-NEXT: [[TMP2:%.*]] = fmul double [[DOTUNPACK]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP3:%.*]] = fmul double [[TMP2]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP4:%.*]] = fsub double 0.000000e+00, [[TMP3]] |
| ; CHECK-NEXT: [[DOTUNPACK7533:%.*]] = load double, ptr [[TMP0]], align 8 |
| ; CHECK-NEXT: [[TMP5:%.*]] = fmul double [[TMP4]], [[DOTUNPACK7533]] |
| ; CHECK-NEXT: [[TMP6:%.*]] = fadd double [[TMP5]], [[DOTUNPACK]] |
| ; CHECK-NEXT: [[TMP7:%.*]] = fmul double [[TMP6]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP8:%.*]] = fsub double 0.000000e+00, [[TMP7]] |
| ; CHECK-NEXT: [[TMP9:%.*]] = fmul double [[TMP8]], [[DOTUNPACK]] |
| ; CHECK-NEXT: [[TMP10:%.*]] = fmul double [[TMP6]], [[TMP2]] |
| ; CHECK-NEXT: [[TMP11:%.*]] = fmul double [[TMP10]], [[DOTUNPACK]] |
| ; CHECK-NEXT: [[TMP12:%.*]] = fadd double [[TMP9]], [[TMP11]] |
| ; CHECK-NEXT: [[TMP13:%.*]] = fmul double [[TMP12]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP14:%.*]] = fadd double [[TMP13]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP15:%.*]] = call { double, double } @__divdc3(double [[TMP14]]) |
| ; CHECK-NEXT: [[TMP16:%.*]] = fmul double [[TMP2]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP17:%.*]] = fmul double [[TMP16]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP18:%.*]] = fadd double [[TMP17]], [[DOTUNPACK]] |
| ; CHECK-NEXT: [[TMP19:%.*]] = fmul double [[TMP18]], [[DOTUNPACK7533]] |
| ; CHECK-NEXT: [[TMP20:%.*]] = fsub double [[DOTUNPACK]], [[TMP19]] |
| ; CHECK-NEXT: [[TMP21:%.*]] = fmul double [[TMP18]], [[DOTUNPACK]] |
| ; CHECK-NEXT: call void @llvm.stackrestore.p0(ptr null) |
| ; CHECK-NEXT: [[TMP22:%.*]] = fadd double [[TMP20]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP23:%.*]] = fmul double [[TMP22]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP24:%.*]] = fadd double [[TMP21]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP25:%.*]] = fmul double [[TMP24]], [[DOTUNPACK]] |
| ; CHECK-NEXT: [[TMP26:%.*]] = fadd double [[TMP23]], [[TMP25]] |
| ; CHECK-NEXT: [[TMP27:%.*]] = fadd double [[TMP26]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP28:%.*]] = call { double, double } @__divdc3(double [[TMP27]]) |
| ; CHECK-NEXT: [[TMP29:%.*]] = fadd double [[DOTUNPACK]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP30:%.*]] = call { double, double } @__divdc3(double [[TMP29]]) |
| ; CHECK-NEXT: [[TMP31:%.*]] = fmul double [[TMP2]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP32:%.*]] = fmul double [[TMP31]], [[DOTUNPACK7533]] |
| ; CHECK-NEXT: [[TMP33:%.*]] = fadd double [[TMP32]], [[TMP2]] |
| ; CHECK-NEXT: [[TMP34:%.*]] = fmul double [[TMP33]], [[DOTUNPACK]] |
| ; CHECK-NEXT: [[TMP35:%.*]] = fmul double [[TMP33]], [[DOTUNPACK7533]] |
| ; CHECK-NEXT: [[TMP36:%.*]] = fsub double [[DOTUNPACK]], [[TMP35]] |
| ; CHECK-NEXT: [[TMP37:%.*]] = fadd double [[TMP36]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP38:%.*]] = fadd double [[TMP34]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP39:%.*]] = fmul double [[TMP38]], [[DOTUNPACK]] |
| ; CHECK-NEXT: [[TMP40:%.*]] = fadd double [[TMP37]], [[TMP39]] |
| ; CHECK-NEXT: [[TMP41:%.*]] = fmul double [[TMP40]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP42:%.*]] = fadd double [[TMP41]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP43:%.*]] = call { double, double } @__divdc3(double [[TMP42]]) |
| ; CHECK-NEXT: ret { double, double } [[TMP43]] |
| ; |
| %2 = fmul double %.unpack, 0.000000e+00 |
| %3 = fmul double %2, 0.000000e+00 |
| %4 = fsub double 0.000000e+00, %3 |
| %.unpack7533 = load double, ptr %0, align 8 |
| %5 = fmul double %4, %.unpack7533 |
| %6 = fadd double %5, %.unpack |
| %7 = fmul double %6, 0.000000e+00 |
| %8 = fsub double 0.000000e+00, %7 |
| %9 = fmul double %8, %.unpack |
| %10 = fmul double %6, %2 |
| %11 = fmul double %10, %.unpack |
| %12 = fadd double %9, %11 |
| %13 = fmul double %12, 0.000000e+00 |
| %14 = fadd double %13, 0.000000e+00 |
| %15 = call { double, double } @__divdc3(double %14) |
| %16 = fmul double %2, 0.000000e+00 |
| %17 = fmul double %16, 0.000000e+00 |
| %18 = fadd double %17, %.unpack |
| %19 = fmul double %18, %.unpack7533 |
| %20 = fsub double %.unpack, %19 |
| %21 = fmul double %18, %.unpack |
| call void @llvm.stackrestore.p0(ptr null) |
| %22 = fadd double %20, 0.000000e+00 |
| %23 = fmul double %22, 0.000000e+00 |
| %24 = fadd double %21, 0.000000e+00 |
| %25 = fmul double %24, %.unpack |
| %26 = fadd double %23, %25 |
| %27 = fadd double %26, 0.000000e+00 |
| %28 = call { double, double } @__divdc3(double %27) |
| %29 = fadd double %.unpack, 0.000000e+00 |
| %30 = call { double, double } @__divdc3(double %29) |
| %31 = fmul double %2, 0.000000e+00 |
| %32 = fmul double %31, %.unpack7533 |
| %33 = fadd double %32, %2 |
| %34 = fmul double %33, %.unpack |
| %35 = fmul double %33, %.unpack7533 |
| %36 = fsub double %.unpack, %35 |
| %37 = fadd double %36, 0.000000e+00 |
| %38 = fadd double %34, 0.000000e+00 |
| %39 = fmul double %38, %.unpack |
| %40 = fadd double %37, %39 |
| %41 = fmul double %40, 0.000000e+00 |
| %42 = fadd double %41, 0.000000e+00 |
| %43 = call { double, double } @__divdc3(double %42) |
| ret { double, double } %43 |
| } |
| |
| define { double, double } @test3(double %.unpack753, double %0) { |
| ; CHECK-LABEL: define { double, double } @test3( |
| ; CHECK-SAME: double [[DOTUNPACK753:%.*]], double [[TMP0:%.*]]) { |
| ; CHECK-NEXT: [[TMP2:%.*]] = fsub double 0.000000e+00, [[DOTUNPACK753]] |
| ; CHECK-NEXT: [[TMP3:%.*]] = fmul double [[TMP2]], [[TMP0]] |
| ; CHECK-NEXT: [[TMP4:%.*]] = fadd double [[TMP3]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP5:%.*]] = fmul double [[TMP4]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP6:%.*]] = fadd double [[TMP5]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP7:%.*]] = call { double, double } @__divdc3(double [[TMP6]]) |
| ; CHECK-NEXT: [[TMP8:%.*]] = fsub double 0.000000e+00, [[DOTUNPACK753]] |
| ; CHECK-NEXT: [[FACTOR828:%.*]] = fmul double [[TMP0]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP9:%.*]] = fsub double [[TMP8]], [[FACTOR828]] |
| ; CHECK-NEXT: call void @llvm.stackrestore.p0(ptr null) |
| ; CHECK-NEXT: [[TMP10:%.*]] = fadd double [[TMP9]], 1.000000e+00 |
| ; CHECK-NEXT: [[TMP11:%.*]] = fmul double [[TMP10]], [[TMP0]] |
| ; CHECK-NEXT: [[TMP12:%.*]] = fmul double [[TMP11]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP13:%.*]] = fadd double [[TMP10]], [[TMP12]] |
| ; CHECK-NEXT: [[TMP14:%.*]] = call { double, double } @__divdc3(double [[TMP13]]) |
| ; CHECK-NEXT: [[TMP15:%.*]] = fadd double [[DOTUNPACK753]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP16:%.*]] = fmul double [[TMP15]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP17:%.*]] = fadd double [[TMP16]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP18:%.*]] = fmul double [[TMP17]], [[TMP8]] |
| ; CHECK-NEXT: [[TMP19:%.*]] = fadd double [[TMP18]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP20:%.*]] = fmul double [[TMP19]], [[DOTUNPACK753]] |
| ; CHECK-NEXT: [[TMP21:%.*]] = fadd double [[TMP20]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP22:%.*]] = call { double, double } @__divdc3(double [[TMP21]]) |
| ; CHECK-NEXT: [[TMP23:%.*]] = fmul double [[TMP17]], [[FACTOR828]] |
| ; CHECK-NEXT: [[TMP24:%.*]] = fmul double [[TMP23]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP25:%.*]] = fadd double [[TMP24]], 0.000000e+00 |
| ; CHECK-NEXT: [[TMP26:%.*]] = call { double, double } @__divdc3(double [[TMP25]]) |
| ; CHECK-NEXT: ret { double, double } [[TMP26]] |
| ; |
| %2 = fsub double 0.000000e+00, %.unpack753 |
| %3 = fmul double %2, %0 |
| %4 = fadd double %3, 0.000000e+00 |
| %5 = fmul double %4, 0.000000e+00 |
| %6 = fadd double %5, 0.000000e+00 |
| %7 = call { double, double } @__divdc3(double %6) |
| %8 = fsub double 0.000000e+00, %.unpack753 |
| %factor828 = fmul double %0, 0.000000e+00 |
| %9 = fsub double %8, %factor828 |
| call void @llvm.stackrestore.p0(ptr null) |
| %10 = fadd double %9, 1.000000e+00 |
| %11 = fmul double %10, %0 |
| %12 = fmul double %11, 0.000000e+00 |
| %13 = fadd double %10, %12 |
| %14 = call { double, double } @__divdc3(double %13) |
| %15 = fadd double %.unpack753, 0.000000e+00 |
| %16 = fmul double %15, 0.000000e+00 |
| %17 = fadd double %16, 0.000000e+00 |
| %18 = fmul double %17, %8 |
| %19 = fadd double %18, 0.000000e+00 |
| %20 = fmul double %19, %.unpack753 |
| %21 = fadd double %20, 0.000000e+00 |
| %22 = call { double, double } @__divdc3(double %21) |
| %23 = fmul double %17, %factor828 |
| %24 = fmul double %23, 0.000000e+00 |
| %25 = fadd double %24, 0.000000e+00 |
| %26 = call { double, double } @__divdc3(double %25) |
| ret { double, double } %26 |
| } |
| |
| declare { double, double } @__divdc3(double) |
| |
| declare void @llvm.stackrestore.p0(ptr) |