228 lines · plain
1; RUN: llc -O3 -mtriple=thumbv7em -mcpu=cortex-m4 %s -o - | FileCheck %s --check-prefix=CHECK-REG-PRESSURE2; RUN: llc -O3 -mtriple=thumbv7eb %s -o - | FileCheck %s --check-prefix=CHECK-UNSUPPORTED3; RUN: llc -O3 -mtriple=thumbv8m.main -mattr=+dsp -arm-parallel-dsp-load-limit=20 %s -o - | FileCheck %s --check-prefix=CHECK4 5; CHECK-UNSUPPORTED-LABEL: unroll_n_jam_smlad6; CHECK-UNSUPPORTED-NOT: smlad r{{.}}7 8; Test that the duplicate loads are removed, which allows parallel dsp to find9; the parallel operations.10 11; CHECK-LABEL: unroll_n_jam_smlad12define void @unroll_n_jam_smlad(ptr %res, ptr %A, ptr %B, i32 %N, i32 %idx) {13entry:14 %xtraiter306.i = and i32 %N, 315 %unroll_iter310.i = sub i32 %N, %xtraiter306.i16 %arrayidx.us.i117.i = getelementptr inbounds i32, ptr %res, i32 %idx17 store i32 0, ptr %arrayidx.us.i117.i, align 418 %mul.us.i118.i = mul i32 %idx, %N19 %inc11.us.i.i = or disjoint i32 %idx, 120 %arrayidx.us.i117.1.i = getelementptr inbounds i32, ptr %res, i32 %inc11.us.i.i21 store i32 0, ptr %arrayidx.us.i117.1.i, align 422 %mul.us.i118.1.i = mul i32 %inc11.us.i.i, %N23 %inc11.us.i.1.i = or disjoint i32 %idx, 224 %arrayidx.us.i117.2.i = getelementptr inbounds i32, ptr %res, i32 %inc11.us.i.1.i25 store i32 0, ptr %arrayidx.us.i117.2.i, align 426 %mul.us.i118.2.i = mul i32 %inc11.us.i.1.i, %N27 %inc11.us.i.2.i = or disjoint i32 %idx, 328 %arrayidx.us.i117.3.i = getelementptr inbounds i32, ptr %res, i32 %inc11.us.i.2.i29 store i32 0, ptr %arrayidx.us.i117.3.i, align 430 %mul.us.i118.3.i = mul i32 %inc11.us.i.2.i, %N31 %inc11.us.i.3.i = add i32 %idx, 432 br label %for.body33 34; TODO: CSE, or something similar, is required to remove the duplicate loads.35; CHECK: %for.body36; CHECK: smlad37; CHECK: smlad38; CHECK-NOT: smlad r{{.*}}39 40; CHECK-REG-PRESSURE: .LBB0_1:41; CHECK-REG-PRESSURE-NOT: call i32 @llvm.arm.smlad42; CHECK-REG-PRESSURE: ldr{{.*}}, [sp43; CHECK-REG-PRESSURE: ldr{{.*}}, [sp44; CHECK-REG-PRESSURE: ldr{{.*}}, [sp45; CHECK-REG-PRESSURE: ldr{{.*}}, [sp46; CHECK-REG-PRESSURE: ldr{{.*}}, [sp47; CHECK-REG-PRESSURE-NOT: ldr{{.*}}, [sp48; CHECK-REG-PRESSURE: bne .LBB0_149 50for.body:51 %A3 = phi i32 [ %add9.us.i.3361.i, %for.body ], [ 0, %entry ]52 %j.026.us.i.i = phi i32 [ %inc.us.i.3362.i, %for.body ], [ 0, %entry ]53 %A4 = phi i32 [ %add9.us.i.1.3.i, %for.body ], [ 0, %entry ]54 %A5 = phi i32 [ %add9.us.i.2.3.i, %for.body ], [ 0, %entry ]55 %A6 = phi i32 [ %add9.us.i.3.3.i, %for.body ], [ 0, %entry ]56 %niter335.i = phi i32 [ %niter335.nsub.3.i, %for.body ], [ %unroll_iter310.i, %entry ]57 %add.us.i.i = add i32 %j.026.us.i.i, %mul.us.i118.i58 %arrayidx4.us.i.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.i59 %A7 = load i16, ptr %arrayidx4.us.i.i, align 260 %conv.us.i.i = sext i16 %A7 to i3261 %arrayidx5.us.i.i = getelementptr inbounds i16, ptr %B, i32 %j.026.us.i.i62 %A8 = load i16, ptr %arrayidx5.us.i.i, align 263 %conv6.us.i.i = sext i16 %A8 to i3264 %mul7.us.i.i = mul nsw i32 %conv6.us.i.i, %conv.us.i.i65 %add9.us.i.i = add nsw i32 %mul7.us.i.i, %A366 %inc.us.i.i = or disjoint i32 %j.026.us.i.i, 167 %add.us.i.1.i = add i32 %j.026.us.i.i, %mul.us.i118.1.i68 %arrayidx4.us.i.1.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.1.i69 %A9 = load i16, ptr %arrayidx4.us.i.1.i, align 270 %conv.us.i.1.i = sext i16 %A9 to i3271 %arrayidx5.us.i.1.i = getelementptr inbounds i16, ptr %B, i32 %j.026.us.i.i72 %B0 = load i16, ptr %arrayidx5.us.i.1.i, align 273 %conv6.us.i.1.i = sext i16 %B0 to i3274 %mul7.us.i.1.i = mul nsw i32 %conv6.us.i.1.i, %conv.us.i.1.i75 %add9.us.i.1.i = add nsw i32 %mul7.us.i.1.i, %A476 %inc.us.i.1.i = or disjoint i32 %j.026.us.i.i, 177 %add.us.i.2.i = add i32 %j.026.us.i.i, %mul.us.i118.2.i78 %arrayidx4.us.i.2.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.2.i79 %B1 = load i16, ptr %arrayidx4.us.i.2.i, align 280 %conv.us.i.2.i = sext i16 %B1 to i3281 %arrayidx5.us.i.2.i = getelementptr inbounds i16, ptr %B, i32 %j.026.us.i.i82 %B2 = load i16, ptr %arrayidx5.us.i.2.i, align 283 %conv6.us.i.2.i = sext i16 %B2 to i3284 %mul7.us.i.2.i = mul nsw i32 %conv6.us.i.2.i, %conv.us.i.2.i85 %add9.us.i.2.i = add nsw i32 %mul7.us.i.2.i, %A586 %inc.us.i.2.i = or disjoint i32 %j.026.us.i.i, 187 %add.us.i.3.i = add i32 %j.026.us.i.i, %mul.us.i118.3.i88 %arrayidx4.us.i.3.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.3.i89 %B3 = load i16, ptr %arrayidx4.us.i.3.i, align 290 %conv.us.i.3.i = sext i16 %B3 to i3291 %arrayidx5.us.i.3.i = getelementptr inbounds i16, ptr %B, i32 %j.026.us.i.i92 %B4 = load i16, ptr %arrayidx5.us.i.3.i, align 293 %conv6.us.i.3.i = sext i16 %B4 to i3294 %mul7.us.i.3.i = mul nsw i32 %conv6.us.i.3.i, %conv.us.i.3.i95 %add9.us.i.3.i = add nsw i32 %mul7.us.i.3.i, %A696 %inc.us.i.3.i = or disjoint i32 %j.026.us.i.i, 197 %add.us.i.1337.i = add i32 %inc.us.i.i, %mul.us.i118.i98 %arrayidx4.us.i.1338.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.1337.i99 %B5 = load i16, ptr %arrayidx4.us.i.1338.i, align 2100 %conv.us.i.1339.i = sext i16 %B5 to i32101 %arrayidx5.us.i.1340.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.i102 %B6 = load i16, ptr %arrayidx5.us.i.1340.i, align 2103 %conv6.us.i.1341.i = sext i16 %B6 to i32104 %mul7.us.i.1342.i = mul nsw i32 %conv6.us.i.1341.i, %conv.us.i.1339.i105 %add9.us.i.1343.i = add nsw i32 %mul7.us.i.1342.i, %add9.us.i.i106 %inc.us.i.1344.i = or disjoint i32 %j.026.us.i.i, 2107 %add.us.i.1.1.i = add i32 %inc.us.i.1.i, %mul.us.i118.1.i108 %arrayidx4.us.i.1.1.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.1.1.i109 %B7 = load i16, ptr %arrayidx4.us.i.1.1.i, align 2110 %conv.us.i.1.1.i = sext i16 %B7 to i32111 %arrayidx5.us.i.1.1.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.1.i112 %B6.dup = load i16, ptr %arrayidx5.us.i.1.1.i, align 2113 %conv6.us.i.1.1.i = sext i16 %B6.dup to i32114 %mul7.us.i.1.1.i = mul nsw i32 %conv6.us.i.1.1.i, %conv.us.i.1.1.i115 %add9.us.i.1.1.i = add nsw i32 %mul7.us.i.1.1.i, %add9.us.i.1.i116 %inc.us.i.1.1.i = or disjoint i32 %j.026.us.i.i, 2117 %add.us.i.2.1.i = add i32 %inc.us.i.2.i, %mul.us.i118.2.i118 %arrayidx4.us.i.2.1.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.2.1.i119 %B9 = load i16, ptr %arrayidx4.us.i.2.1.i, align 2120 %conv.us.i.2.1.i = sext i16 %B9 to i32121 %arrayidx5.us.i.2.1.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.2.i122 %B6.dup.i = load i16, ptr %arrayidx5.us.i.2.1.i, align 2123 %conv6.us.i.2.1.i = sext i16 %B6.dup.i to i32124 %mul7.us.i.2.1.i = mul nsw i32 %conv6.us.i.2.1.i, %conv.us.i.2.1.i125 %add9.us.i.2.1.i = add nsw i32 %mul7.us.i.2.1.i, %add9.us.i.2.i126 %inc.us.i.2.1.i = or disjoint i32 %j.026.us.i.i, 2127 %add.us.i.3.1.i = add i32 %inc.us.i.3.i, %mul.us.i118.3.i128 %arrayidx4.us.i.3.1.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.3.1.i129 %B11 = load i16, ptr %arrayidx4.us.i.3.1.i, align 2130 %conv.us.i.3.1.i = sext i16 %B11 to i32131 %arrayidx5.us.i.3.1.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.3.i132 %B6.dup.i.i = load i16, ptr %arrayidx5.us.i.3.1.i, align 2133 %conv6.us.i.3.1.i = sext i16 %B6.dup.i.i to i32134 %mul7.us.i.3.1.i = mul nsw i32 %conv6.us.i.3.1.i, %conv.us.i.3.1.i135 %add9.us.i.3.1.i = add nsw i32 %mul7.us.i.3.1.i, %add9.us.i.3.i136 %inc.us.i.3.1.i = or disjoint i32 %j.026.us.i.i, 2137 %add.us.i.2346.i = add i32 %inc.us.i.1344.i, %mul.us.i118.i138 %arrayidx4.us.i.2347.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.2346.i139 %B13 = load i16, ptr %arrayidx4.us.i.2347.i, align 2140 %conv.us.i.2348.i = sext i16 %B13 to i32141 %arrayidx5.us.i.2349.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.1344.i142 %B14 = load i16, ptr %arrayidx5.us.i.2349.i, align 2143 %conv6.us.i.2350.i = sext i16 %B14 to i32144 %mul7.us.i.2351.i = mul nsw i32 %conv6.us.i.2350.i, %conv.us.i.2348.i145 %add9.us.i.2352.i = add nsw i32 %mul7.us.i.2351.i, %add9.us.i.1343.i146 %inc.us.i.2353.i = or disjoint i32 %j.026.us.i.i, 3147 %add.us.i.1.2.i = add i32 %inc.us.i.1.1.i, %mul.us.i118.1.i148 %arrayidx4.us.i.1.2.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.1.2.i149 %B15 = load i16, ptr %arrayidx4.us.i.1.2.i, align 2150 %conv.us.i.1.2.i = sext i16 %B15 to i32151 %arrayidx5.us.i.1.2.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.1.1.i152 %B14.dup = load i16, ptr %arrayidx5.us.i.1.2.i, align 2153 %conv6.us.i.1.2.i = sext i16 %B14.dup to i32154 %mul7.us.i.1.2.i = mul nsw i32 %conv6.us.i.1.2.i, %conv.us.i.1.2.i155 %add9.us.i.1.2.i = add nsw i32 %mul7.us.i.1.2.i, %add9.us.i.1.1.i156 %inc.us.i.1.2.i = or disjoint i32 %j.026.us.i.i, 3157 %add.us.i.2.2.i = add i32 %inc.us.i.2.1.i, %mul.us.i118.2.i158 %arrayidx4.us.i.2.2.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.2.2.i159 %B17 = load i16, ptr %arrayidx4.us.i.2.2.i, align 2160 %conv.us.i.2.2.i = sext i16 %B17 to i32161 %arrayidx5.us.i.2.2.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.2.1.i162 %B14.dup.i = load i16, ptr %arrayidx5.us.i.2.2.i, align 2163 %conv6.us.i.2.2.i = sext i16 %B14.dup.i to i32164 %mul7.us.i.2.2.i = mul nsw i32 %conv6.us.i.2.2.i, %conv.us.i.2.2.i165 %add9.us.i.2.2.i = add nsw i32 %mul7.us.i.2.2.i, %add9.us.i.2.1.i166 %inc.us.i.2.2.i = or disjoint i32 %j.026.us.i.i, 3167 %add.us.i.3.2.i = add i32 %inc.us.i.3.1.i, %mul.us.i118.3.i168 %arrayidx4.us.i.3.2.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.3.2.i169 %B19 = load i16, ptr %arrayidx4.us.i.3.2.i, align 2170 %conv.us.i.3.2.i = sext i16 %B19 to i32171 %arrayidx5.us.i.3.2.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.3.1.i172 %B14.dup.i.i = load i16, ptr %arrayidx5.us.i.3.2.i, align 2173 %conv6.us.i.3.2.i = sext i16 %B14.dup.i.i to i32174 %mul7.us.i.3.2.i = mul nsw i32 %conv6.us.i.3.2.i, %conv.us.i.3.2.i175 %add9.us.i.3.2.i = add nsw i32 %mul7.us.i.3.2.i, %add9.us.i.3.1.i176 %inc.us.i.3.2.i = or disjoint i32 %j.026.us.i.i, 3177 %add.us.i.3355.i = add i32 %inc.us.i.2353.i, %mul.us.i118.i178 %arrayidx4.us.i.3356.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.3355.i179 %B21 = load i16, ptr %arrayidx4.us.i.3356.i, align 2180 %conv.us.i.3357.i = sext i16 %B21 to i32181 %arrayidx5.us.i.3358.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.2353.i182 %B22 = load i16, ptr %arrayidx5.us.i.3358.i, align 2183 %conv6.us.i.3359.i = sext i16 %B22 to i32184 %mul7.us.i.3360.i = mul nsw i32 %conv6.us.i.3359.i, %conv.us.i.3357.i185 %add9.us.i.3361.i = add nsw i32 %mul7.us.i.3360.i, %add9.us.i.2352.i186 %inc.us.i.3362.i = add i32 %j.026.us.i.i, 4187 %add.us.i.1.3.i = add i32 %inc.us.i.1.2.i, %mul.us.i118.1.i188 %arrayidx4.us.i.1.3.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.1.3.i189 %B23 = load i16, ptr %arrayidx4.us.i.1.3.i, align 2190 %conv.us.i.1.3.i = sext i16 %B23 to i32191 %arrayidx5.us.i.1.3.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.1.2.i192 %B22.dup = load i16, ptr %arrayidx5.us.i.1.3.i, align 2193 %conv6.us.i.1.3.i = sext i16 %B22.dup to i32194 %mul7.us.i.1.3.i = mul nsw i32 %conv6.us.i.1.3.i, %conv.us.i.1.3.i195 %add9.us.i.1.3.i = add nsw i32 %mul7.us.i.1.3.i, %add9.us.i.1.2.i196 %add.us.i.2.3.i = add i32 %inc.us.i.2.2.i, %mul.us.i118.2.i197 %arrayidx4.us.i.2.3.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.2.3.i198 %B25 = load i16, ptr %arrayidx4.us.i.2.3.i, align 2199 %conv.us.i.2.3.i = sext i16 %B25 to i32200 %arrayidx5.us.i.2.3.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.2.2.i201 %B22.dup.i = load i16, ptr %arrayidx5.us.i.2.3.i, align 2202 %conv6.us.i.2.3.i = sext i16 %B22.dup.i to i32203 %mul7.us.i.2.3.i = mul nsw i32 %conv6.us.i.2.3.i, %conv.us.i.2.3.i204 %add9.us.i.2.3.i = add nsw i32 %mul7.us.i.2.3.i, %add9.us.i.2.2.i205 %add.us.i.3.3.i = add i32 %inc.us.i.3.2.i, %mul.us.i118.3.i206 %arrayidx4.us.i.3.3.i = getelementptr inbounds i16, ptr %A, i32 %add.us.i.3.3.i207 %B27 = load i16, ptr %arrayidx4.us.i.3.3.i, align 2208 %conv.us.i.3.3.i = sext i16 %B27 to i32209 %arrayidx5.us.i.3.3.i = getelementptr inbounds i16, ptr %B, i32 %inc.us.i.3.2.i210 %B22.dup.i.i = load i16, ptr %arrayidx5.us.i.3.3.i, align 2211 %conv6.us.i.3.3.i = sext i16 %B22.dup.i.i to i32212 %mul7.us.i.3.3.i = mul nsw i32 %conv6.us.i.3.3.i, %conv.us.i.3.3.i213 %add9.us.i.3.3.i = add nsw i32 %mul7.us.i.3.3.i, %add9.us.i.3.2.i214 %niter335.nsub.3.i = add i32 %niter335.i, -4215 %niter335.ncmp.3.i = icmp eq i32 %niter335.nsub.3.i, 0216 br i1 %niter335.ncmp.3.i, label %exit, label %for.body217 218exit:219 store i32 %add9.us.i.3361.i, ptr %res, align 4220 %arrayidx.out.1.i = getelementptr inbounds i32, ptr %res, i32 1221 store i32 %add9.us.i.1.3.i, ptr %arrayidx.out.1.i, align 4222 %arrayidx.out.2.i = getelementptr inbounds i32, ptr %res, i32 2223 store i32 %add9.us.i.2.3.i, ptr %arrayidx.out.2.i, align 4224 %arrayidx.out.3.i = getelementptr inbounds i32, ptr %res, i32 3225 store i32 %add9.us.i.3.3.i, ptr %arrayidx.out.3.i, align 4226 ret void227}228