brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.3 KiB · 51d1133 Raw
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