blob: 0500c00537a3247e84fac37bd2c971d0b79aa099 [file] [edit]
; 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)