| ; 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: [[DOTELT752:%.*]] = getelementptr i8, ptr [[TMP0]], i64 8 | |
| ; CHECK-NEXT: [[DOTUNPACK7532:%.*]] = load double, ptr [[DOTELT752]], align 8 | |
| ; CHECK-NEXT: [[DOTUNPACK1:%.*]] = load double, ptr [[TMP0]], align 8 | |
| ; CHECK-NEXT: [[TMP2:%.*]] = fmul double [[DOTUNPACK753]], [[DOTUNPACK1]] | |
| ; CHECK-NEXT: [[FACTOR8283:%.*]] = fmul double [[TMP2]], 0.000000e+00 | |
| ; CHECK-NEXT: [[TMP3:%.*]] = fmul double [[FACTOR8283]], 0.000000e+00 | |
| ; CHECK-NEXT: [[TMP4:%.*]] = fadd contract double [[TMP3]], 0.000000e+00 | |
| ; CHECK-NEXT: [[TMP5:%.*]] = fmul double [[TMP4]], [[DOTUNPACK753]] | |
| ; CHECK-NEXT: [[TMP31:%.*]] = fadd contract double [[TMP5]], 0.000000e+00 | |
| ; CHECK-NEXT: [[TMP32:%.*]] = call { double, double } @__divdc3(double [[TMP31]]) | |
| ; CHECK-NEXT: [[TMP8:%.*]] = fmul double [[DOTUNPACK1]], [[DOTUNPACK1]] | |
| ; CHECK-NEXT: [[TMP9:%.*]] = fmul double [[TMP8]], [[FACTOR828]] | |
| ; CHECK-NEXT: [[TMP10:%.*]] = fadd contract double [[TMP9]], 0.000000e+00 | |
| ; CHECK-NEXT: [[TMP11:%.*]] = fmul double [[TMP10]], 0.000000e+00 | |
| ; CHECK-NEXT: call void @llvm.stackrestore.p0(ptr null) | |
| ; CHECK-NEXT: [[TMP12:%.*]] = fsub double 0.000000e+00, [[TMP11]] | |
| ; CHECK-NEXT: [[TMP13:%.*]] = fmul double [[TMP12]], [[FACTOR8283]] | |
| ; CHECK-NEXT: [[TMP14:%.*]] = fmul double [[TMP8]], 0.000000e+00 | |
| ; CHECK-NEXT: [[TMP15:%.*]] = fadd contract double [[TMP13]], [[TMP14]] | |
| ; CHECK-NEXT: [[TMP16:%.*]] = fmul double [[TMP15]], [[DOTUNPACK753]] | |
| ; CHECK-NEXT: [[TMP33:%.*]] = fadd double [[DOTUNPACK753]], [[TMP16]] | |
| ; CHECK-NEXT: [[TMP34:%.*]] = call { double, double } @__divdc3(double [[TMP33]]) | |
| ; CHECK-NEXT: [[TMP35:%.*]] = fadd double [[DOTUNPACK1]], 0.000000e+00 | |
| ; CHECK-NEXT: [[TMP36:%.*]] = call { double, double } @__divdc3(double [[TMP35]]) | |
| ; CHECK-NEXT: [[TMP21:%.*]] = fmul double [[TMP2]], f0xC1502A98AE76C8B4 | |
| ; CHECK-NEXT: [[TMP22:%.*]] = fadd contract double [[TMP21]], 0.000000e+00 | |
| ; CHECK-NEXT: [[TMP23:%.*]] = fmul double [[TMP22]], 0.000000e+00 | |
| ; CHECK-NEXT: [[TMP24:%.*]] = fsub double 0.000000e+00, [[TMP23]] | |
| ; CHECK-NEXT: [[TMP25:%.*]] = fmul double [[TMP24]], [[FACTOR8283]] | |
| ; CHECK-NEXT: [[TMP26:%.*]] = fadd contract double [[TMP25]], [[TMP14]] | |
| ; CHECK-NEXT: [[TMP27:%.*]] = fmul double [[TMP26]], [[DOTUNPACK753]] | |
| ; CHECK-NEXT: [[TMP37:%.*]] = fadd double [[DOTUNPACK7532]], [[TMP27]] | |
| ; 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) |