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