[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / SLPVectorizer / AArch64 / fmulladd.ll
blob24d2ed97d0fa1efb9bffc6a3608e5fba05404f61
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=slp-vectorizer -mtriple=aarch64-unknown-unknown -mcpu=cortex-a53 -S | FileCheck %s
4 @b = common global i32 0, align 4
5 @a = common global ptr null, align 8
7 define void @foo(ptr %d, ptr %e) {
8 ; CHECK-LABEL: @foo(
9 ; CHECK-NEXT:  entry:
10 ; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [4 x double], ptr [[D:%.*]], i64 2
11 ; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds [4 x double], ptr [[D]], i64 0, i64 3
12 ; CHECK-NEXT:    [[TMP0:%.*]] = load double, ptr [[ARRAYIDX3]], align 8
13 ; CHECK-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds [4 x double], ptr [[E:%.*]], i64 3
14 ; CHECK-NEXT:    [[ARRAYIDX15:%.*]] = getelementptr inbounds [4 x double], ptr [[D]], i64 1, i64 3
15 ; CHECK-NEXT:    [[TMP1:%.*]] = load double, ptr [[ARRAYIDX15]], align 8
16 ; CHECK-NEXT:    [[ARRAYIDX17:%.*]] = getelementptr inbounds [4 x double], ptr [[D]], i64 3, i64 2
17 ; CHECK-NEXT:    [[TMP2:%.*]] = load double, ptr [[ARRAYIDX17]], align 8
18 ; CHECK-NEXT:    [[ARRAYIDX19:%.*]] = getelementptr inbounds [4 x double], ptr [[E]], i64 2, i64 3
19 ; CHECK-NEXT:    [[TMP3:%.*]] = load double, ptr [[ARRAYIDX19]], align 8
20 ; CHECK-NEXT:    [[TMP4:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP2]], double [[TMP3]], double [[TMP1]])
21 ; CHECK-NEXT:    [[ARRAYIDX21:%.*]] = getelementptr inbounds [4 x double], ptr [[D]], i64 3, i64 3
22 ; CHECK-NEXT:    [[TMP5:%.*]] = load double, ptr [[ARRAYIDX21]], align 8
23 ; CHECK-NEXT:    [[ARRAYIDX23:%.*]] = getelementptr inbounds [4 x double], ptr [[E]], i64 3, i64 3
24 ; CHECK-NEXT:    [[TMP6:%.*]] = load double, ptr [[ARRAYIDX23]], align 8
25 ; CHECK-NEXT:    [[TMP7:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP5]], double [[TMP6]], double [[TMP4]])
26 ; CHECK-NEXT:    [[TMP8:%.*]] = load ptr, ptr @a, align 8
27 ; CHECK-NEXT:    [[TMP9:%.*]] = load <2 x double>, ptr [[ARRAYIDX]], align 8
28 ; CHECK-NEXT:    [[TMP10:%.*]] = load <2 x double>, ptr [[ARRAYIDX4]], align 8
29 ; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x double> poison, double [[TMP0]], i32 0
30 ; CHECK-NEXT:    [[TMP12:%.*]] = shufflevector <2 x double> [[TMP11]], <2 x double> poison, <2 x i32> zeroinitializer
31 ; CHECK-NEXT:    [[TMP13:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP12]], <2 x double> [[TMP10]], <2 x double> [[TMP9]])
32 ; CHECK-NEXT:    store <2 x double> [[TMP13]], ptr [[TMP8]], align 8
33 ; CHECK-NEXT:    [[F_SROA_539_0__SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[TMP8]], i64 40
34 ; CHECK-NEXT:    store double [[TMP7]], ptr [[F_SROA_539_0__SROA_IDX]], align 8
35 ; CHECK-NEXT:    store i32 6, ptr @b, align 4
36 ; CHECK-NEXT:    ret void
38 entry:
39   %arrayidx = getelementptr inbounds [4 x double], ptr %d, i64 2
40   %0 = load double, ptr %arrayidx, align 8
41   %arrayidx3 = getelementptr inbounds [4 x double], ptr %d, i64 0, i64 3
42   %1 = load double, ptr %arrayidx3, align 8
43   %arrayidx4 = getelementptr inbounds [4 x double], ptr %e, i64 3
44   %2 = load double, ptr %arrayidx4, align 8
45   %3 = tail call double @llvm.fmuladd.f64(double %1, double %2, double %0)
46   %arrayidx8 = getelementptr inbounds [4 x double], ptr %d, i64 2, i64 1
47   %4 = load double, ptr %arrayidx8, align 8
48   %arrayidx12 = getelementptr inbounds [4 x double], ptr %e, i64 3, i64 1
49   %5 = load double, ptr %arrayidx12, align 8
50   %6 = tail call double @llvm.fmuladd.f64(double %1, double %5, double %4)
51   %arrayidx15 = getelementptr inbounds [4 x double], ptr %d, i64 1, i64 3
52   %7 = load double, ptr %arrayidx15, align 8
53   %arrayidx17 = getelementptr inbounds [4 x double], ptr %d, i64 3, i64 2
54   %8 = load double, ptr %arrayidx17, align 8
55   %arrayidx19 = getelementptr inbounds [4 x double], ptr %e, i64 2, i64 3
56   %9 = load double, ptr %arrayidx19, align 8
57   %10 = tail call double @llvm.fmuladd.f64(double %8, double %9, double %7)
58   %arrayidx21 = getelementptr inbounds [4 x double], ptr %d, i64 3, i64 3
59   %11 = load double, ptr %arrayidx21, align 8
60   %arrayidx23 = getelementptr inbounds [4 x double], ptr %e, i64 3, i64 3
61   %12 = load double, ptr %arrayidx23, align 8
62   %13 = tail call double @llvm.fmuladd.f64(double %11, double %12, double %10)
63   %14 = load ptr, ptr @a, align 8
64   store double %3, ptr %14, align 8
65   %f.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %14, i64 8
66   store double %6, ptr %f.sroa.4.0..sroa_idx, align 8
67   %f.sroa.539.0..sroa_idx = getelementptr inbounds i8, ptr %14, i64 40
68   store double %13, ptr %f.sroa.539.0..sroa_idx, align 8
69   store i32 6, ptr @b, align 4
70   ret void
73 declare double @llvm.fmuladd.f64(double, double, double)