xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/return.ll (revision 15ee17c3ce34623261788d7de3c1bdf5860be34e)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: %if x86-registered-target %{ opt < %s -passes=slp-vectorizer -S -mtriple=x86_64--linux-gnu | FileCheck %s %}
3; RUN: %if aarch64-registered-target %{ opt < %s -passes=slp-vectorizer -S -mtriple=aarch64-unknown-linux-gnu | FileCheck %s %}
4
5@a = common global [4 x double] zeroinitializer, align 8
6@b = common global [4 x double] zeroinitializer, align 8
7
8; [4], b[4];
9; double foo() {
10;  double sum =0;
11;  sum = (a[0]+b[0]) + (a[1]+b[1]);
12;  return sum;
13; }
14
15define double @return1() {
16; CHECK-LABEL: @return1(
17; CHECK-NEXT:  entry:
18; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x double>, ptr @a, align 8
19; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr @b, align 8
20; CHECK-NEXT:    [[TMP2:%.*]] = fadd <2 x double> [[TMP0]], [[TMP1]]
21; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x double> [[TMP2]], i32 0
22; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x double> [[TMP2]], i32 1
23; CHECK-NEXT:    [[ADD2:%.*]] = fadd double [[TMP3]], [[TMP4]]
24; CHECK-NEXT:    ret double [[ADD2]]
25;
26entry:
27  %a0 = load double, ptr @a, align 8
28  %b0 = load double, ptr @b, align 8
29  %add0 = fadd double %a0, %b0
30  %a1 = load double, ptr getelementptr inbounds ([4 x double], ptr @a, i32 0, i32 1), align 8
31  %b1 = load double, ptr getelementptr inbounds ([4 x double], ptr @b, i32 0, i32 1), align 8
32  %add1 = fadd double %a1, %b1
33  %add2 = fadd double %add0, %add1
34  ret double %add2
35}
36
37; double hadd(ptr x) {
38;   return ((x[0] + x[2]) + (x[1] + x[3]));
39; }
40
41define double @return2(ptr nocapture readonly %x) {
42; CHECK-LABEL: @return2(
43; CHECK-NEXT:  entry:
44; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds double, ptr [[X:%.*]], i32 2
45; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[X]], align 4
46; CHECK-NEXT:    [[TMP3:%.*]] = load <2 x double>, ptr [[ARRAYIDX1]], align 4
47; CHECK-NEXT:    [[TMP4:%.*]] = fadd <2 x double> [[TMP1]], [[TMP3]]
48; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x double> [[TMP4]], i32 0
49; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <2 x double> [[TMP4]], i32 1
50; CHECK-NEXT:    [[ADD5:%.*]] = fadd double [[TMP5]], [[TMP6]]
51; CHECK-NEXT:    ret double [[ADD5]]
52;
53entry:
54  %x0 = load double, ptr %x, align 4
55  %arrayidx1 = getelementptr inbounds double, ptr %x, i32 2
56  %x2 = load double, ptr %arrayidx1, align 4
57  %add3 = fadd double %x0, %x2
58  %arrayidx2 = getelementptr inbounds double, ptr %x, i32 1
59  %x1 = load double, ptr %arrayidx2, align 4
60  %arrayidx3 = getelementptr inbounds double, ptr %x, i32 3
61  %x3 = load double, ptr %arrayidx3, align 4
62  %add4 = fadd double %x1, %x3
63  %add5 = fadd double %add3, %add4
64  ret double %add5
65}
66