1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
define ptr @test() {
; CHECK-LABEL: @test(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[GREEN_I:%.*]] = getelementptr inbounds float, ptr null, i32 6
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[GREEN_I]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = fpext <2 x float> [[TMP0]] to <2 x double>
; CHECK-NEXT: br label [[BODY:%.*]]
; CHECK: body:
; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x double> [ [[TMP5:%.*]], [[BODY]] ], [ [[TMP1]], [[ENTRY:%.*]] ]
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i16>, ptr null, align 2
; CHECK-NEXT: [[TMP4:%.*]] = uitofp <2 x i16> [[TMP3]] to <2 x double>
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[TMP4]], <2 x double> poison, <2 x i32> <i32 1, i32 0>
; CHECK-NEXT: [[TMP5]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> zeroinitializer, <2 x double> [[SHUFFLE]], <2 x double> [[TMP2]])
; CHECK-NEXT: br label [[BODY]]
;
entry:
%green.i = getelementptr inbounds float, ptr null, i32 6
%blue.i = getelementptr inbounds float, ptr null, i32 7
%0 = load float, ptr %green.i, align 4
%conv197 = fpext float %0 to double
%1 = load float, ptr %blue.i, align 8
%conv199 = fpext float %1 to double
br label %body
body:
%phi1 = phi double [ %3, %body ], [ %conv197, %entry ]
%phi2 = phi double [ %5, %body ], [ %conv199, %entry ]
%green = getelementptr inbounds i16, ptr null, i32 1
%2 = load i16, ptr %green, align 2
%conv1 = uitofp i16 %2 to double
%3 = call double @llvm.fmuladd.f64(double 0.000000e+00, double %conv1, double %phi1)
%4 = load i16, ptr null, align 2
%conv2 = uitofp i16 %4 to double
%5 = call double @llvm.fmuladd.f64(double 0.000000e+00, double %conv2, double %phi2)
br label %body
}
declare double @llvm.fmuladd.f64(double, double, double)
define void @test1(ptr %agg.result, ptr %this) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 false, label [[RETURN:%.*]], label [[LOR_LHS_FALSE:%.*]]
; CHECK: lor.lhs.false:
; CHECK-NEXT: br i1 false, label [[RETURN]], label [[IF_END:%.*]]
; CHECK: if.end:
; CHECK-NEXT: [[B_I:%.*]] = getelementptr inbounds float, ptr [[THIS:%.*]], i32 1
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[B_I]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = fadd <2 x float> [[TMP0]], zeroinitializer
; CHECK-NEXT: br label [[RETURN]]
; CHECK: return:
; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x float> [ [[TMP1]], [[IF_END]] ], [ <float 1.000000e+00, float 0.000000e+00>, [[LOR_LHS_FALSE]] ], [ <float 1.000000e+00, float 0.000000e+00>, [[ENTRY:%.*]] ]
; CHECK-NEXT: [[C_I_I_I:%.*]] = getelementptr inbounds float, ptr [[AGG_RESULT:%.*]], i32 2
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[TMP2]], <2 x float> poison, <2 x i32> <i32 1, i32 0>
; CHECK-NEXT: store <2 x float> [[SHUFFLE]], ptr [[C_I_I_I]], align 4
; CHECK-NEXT: ret void
;
entry:
br i1 false, label %return, label %lor.lhs.false
lor.lhs.false:
br i1 false, label %return, label %if.end
if.end:
%c.i = getelementptr inbounds float, ptr %this, i32 2
%0 = load float, ptr %c.i, align 4
%add.i = fadd float %0, 0.000000e+00
%b.i = getelementptr inbounds float, ptr %this, i32 1
%1 = load float, ptr %b.i, align 4
%add2.i = fadd float %1, 0.000000e+00
br label %return
return:
%add.i.sink = phi float [ %add.i, %if.end ], [ 0.000000e+00, %lor.lhs.false ], [ 0.000000e+00, %entry ]
%add2.i.sink = phi float [ %add2.i, %if.end ], [ 1.000000e+00, %lor.lhs.false ], [ 1.000000e+00, %entry ]
%c.i.i.i = getelementptr inbounds float, ptr %agg.result, i32 2
store float %add.i.sink, ptr %c.i.i.i, align 4
%d.i.i.i = getelementptr inbounds float, ptr %agg.result, i32 3
store float %add2.i.sink, ptr %d.i.i.i, align 4
ret void
}
; Here PHIs have mutual uses of each other. Reordering one requires reordering the other.
define void @test2(ptr %p1, ptr %p2) {
; CHECK-LABEL: @test2(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[A1:%.*]] = getelementptr inbounds ptr, ptr [[P1:%.*]], i32 0
; CHECK-NEXT: [[B1:%.*]] = getelementptr inbounds ptr, ptr [[P1]], i32 4
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x double>, ptr [[A1]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, ptr [[B1]], align 8
; CHECK-NEXT: [[TMP2:%.*]] = fmul fast <2 x double> <double 1.000000e+01, double 1.000000e-01>, [[TMP0]]
; CHECK-NEXT: [[TMP3:%.*]] = fmul fast <2 x double> <double 1.100000e+01, double 1.100000e+00>, [[TMP1]]
; CHECK-NEXT: [[TMP4:%.*]] = fsub fast <2 x double> <double 1.000000e+01, double 1.000000e-01>, [[TMP3]]
; CHECK-NEXT: [[TMP5:%.*]] = fmul fast <2 x double> [[TMP4]], <double 2.000000e+00, double 2.100000e+00>
; CHECK-NEXT: [[TMP6:%.*]] = fadd fast <2 x double> [[TMP2]], <double 1.000000e+01, double 1.000000e-01>
; CHECK-NEXT: [[TMP7:%.*]] = fadd fast <2 x double> [[TMP6]], [[TMP5]]
; CHECK-NEXT: [[TMP8:%.*]] = fmul fast <2 x double> [[TMP7]], <double 3.000000e+00, double 3.100000e+00>
; CHECK-NEXT: br label [[BB1:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[TMP9:%.*]] = fadd fast <2 x double> <double 4.000000e+00, double 4.100000e+00>, [[TMP8]]
; CHECK-NEXT: [[TMP10:%.*]] = fadd fast <2 x double> [[TMP9]], <double 2.000000e+00, double 2.100000e+00>
; CHECK-NEXT: [[TMP11:%.*]] = fadd fast <2 x double> [[TMP10]], <double 3.000000e+00, double 3.100000e+00>
; CHECK-NEXT: br label [[BB2:%.*]]
; CHECK: bb2:
; CHECK-NEXT: [[TMP12:%.*]] = phi <2 x double> [ [[TMP11]], [[BB1]] ], [ [[TMP16:%.*]], [[BB6:%.*]] ]
; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <2 x double> [[TMP12]], <2 x double> poison, <2 x i32> <i32 1, i32 0>
; CHECK-NEXT: [[X0:%.*]] = getelementptr inbounds double, ptr [[P2:%.*]], i32 0
; CHECK-NEXT: [[TMP14:%.*]] = load <2 x double>, ptr [[X0]], align 8
; CHECK-NEXT: br i1 poison, label [[BB3:%.*]], label [[BB6]]
; CHECK: bb3:
; CHECK-NEXT: br i1 poison, label [[BB5:%.*]], label [[BB4:%.*]]
; CHECK: bb4:
; CHECK-NEXT: br label [[BB6]]
; CHECK: bb5:
; CHECK-NEXT: br label [[BB6]]
; CHECK: bb6:
; CHECK-NEXT: [[TMP15:%.*]] = phi <2 x double> [ [[TMP13]], [[BB2]] ], [ [[TMP14]], [[BB4]] ], [ [[TMP14]], [[BB5]] ]
; CHECK-NEXT: [[TMP16]] = shufflevector <2 x double> [[TMP15]], <2 x double> poison, <2 x i32> <i32 1, i32 0>
; CHECK-NEXT: br label [[BB2]]
;
entry:
%a1 = getelementptr inbounds ptr, ptr %p1, i32 0
%a2 = getelementptr inbounds ptr, ptr %p1, i32 1
%b2 = getelementptr inbounds ptr, ptr %p1, i32 5
%lda1 = load double, ptr %a1, align 8
%lda2 = load double, ptr %a2, align 8
%b1 = getelementptr inbounds ptr, ptr %p1, i32 4
%ldb1 = load double, ptr %b1, align 8
%ldb2 = load double, ptr %b2, align 8
%mul0.1 = fmul fast double 0.1, %lda2
%mul1.1 = fmul fast double 1.1, %ldb2
%sub0.1 = fsub fast double 0.1, %mul1.1
%mul2.1 = fmul fast double %sub0.1, 2.1
%add0.1 = fadd fast double %mul0.1, 0.1
%add1.1 = fadd fast double %add0.1, %mul2.1
%mul3.1 = fmul fast double %add1.1, 3.1
%mul0.0 = fmul fast double 10.0, %lda1
%mul1.0 = fmul fast double 11.0, %ldb1
%sub0.0 = fsub fast double 10.0, %mul1.0
%mul2.0 = fmul fast double %sub0.0, 2.0
%add0.0 = fadd fast double %mul0.0, 10.0
%add1.0 = fadd fast double %add0.0, %mul2.0
%mul3.0 = fmul fast double 3.0, %add1.0
br label %bb1
bb1:
%add4.1 = fadd fast double 4.1, %mul3.1
%add2.1 = fadd fast double %add4.1, 2.1
%add3.1 = fadd fast double %add2.1, 3.1
%add4.0 = fadd fast double 4.0, %mul3.0
%add2.0 = fadd fast double %add4.0, 2.0
%add3.0 = fadd fast double %add2.0, 3.0
br label %bb2
bb2: ; preds = %bb6, %bb1
%phi0.0 = phi double [ %add3.1, %bb1 ], [ %phi1.0, %bb6 ]
%phi0.1 = phi double [ %add3.0, %bb1 ], [ %phi1.1, %bb6 ]
%x0 = getelementptr inbounds double, ptr %p2, i32 0
%i0 = load double, ptr %x0, align 8
%x1 = getelementptr inbounds double, ptr %p2, i32 1
%i1 = load double, ptr %x1, align 8
br i1 poison, label %bb3, label %bb6
bb3: ; preds = %bb2
br i1 poison, label %bb5, label %bb4
bb4: ; preds = %bb3
br label %bb6
bb5: ; preds = %bb3
br label %bb6
bb6: ; preds = %bb5, %bb4, %bb3
%phi1.0 = phi double [ %phi0.0, %bb2 ], [ %i0, %bb4 ], [ %i0, %bb5 ]
%phi1.1 = phi double [ %phi0.1, %bb2 ], [ %i1, %bb4 ], [ %i1, %bb5 ]
br label %bb2
}
|