1 ; REQUIRES: asserts 2 ; RUN: llc < %s -march=x86-64 -mcpu=core2 -pre-RA-sched=source -enable-misched -stats 2>&1 | FileCheck %s 3 ; 4 ; Verify that register pressure heuristics are working in MachineScheduler. 5 ; 6 ; When we enable subtree scheduling heuristics on X86, we may need a 7 ; flag to disable it for this test case. 8 ; 9 ; CHECK: @wrap_mul4 10 ; CHECK: 22 regalloc - Number of spills inserted 11 12 define void @wrap_mul4(double* nocapture %Out, [4 x double]* nocapture %A, [4 x double]* nocapture %B) #0 { 13 entry: 14 %arrayidx1.i = getelementptr inbounds [4 x double]* %A, i64 0, i64 0 15 %0 = load double* %arrayidx1.i, align 8 16 %arrayidx3.i = getelementptr inbounds [4 x double]* %B, i64 0, i64 0 17 %1 = load double* %arrayidx3.i, align 8 18 %mul.i = fmul double %0, %1 19 %arrayidx5.i = getelementptr inbounds [4 x double]* %A, i64 0, i64 1 20 %2 = load double* %arrayidx5.i, align 8 21 %arrayidx7.i = getelementptr inbounds [4 x double]* %B, i64 1, i64 0 22 %3 = load double* %arrayidx7.i, align 8 23 %mul8.i = fmul double %2, %3 24 %add.i = fadd double %mul.i, %mul8.i 25 %arrayidx10.i = getelementptr inbounds [4 x double]* %A, i64 0, i64 2 26 %4 = load double* %arrayidx10.i, align 8 27 %arrayidx12.i = getelementptr inbounds [4 x double]* %B, i64 2, i64 0 28 %5 = load double* %arrayidx12.i, align 8 29 %mul13.i = fmul double %4, %5 30 %add14.i = fadd double %add.i, %mul13.i 31 %arrayidx16.i = getelementptr inbounds [4 x double]* %A, i64 0, i64 3 32 %6 = load double* %arrayidx16.i, align 8 33 %arrayidx18.i = getelementptr inbounds [4 x double]* %B, i64 3, i64 0 34 %7 = load double* %arrayidx18.i, align 8 35 %mul19.i = fmul double %6, %7 36 %add20.i = fadd double %add14.i, %mul19.i 37 %arrayidx25.i = getelementptr inbounds [4 x double]* %B, i64 0, i64 1 38 %8 = load double* %arrayidx25.i, align 8 39 %mul26.i = fmul double %0, %8 40 %arrayidx30.i = getelementptr inbounds [4 x double]* %B, i64 1, i64 1 41 %9 = load double* %arrayidx30.i, align 8 42 %mul31.i = fmul double %2, %9 43 %add32.i = fadd double %mul26.i, %mul31.i 44 %arrayidx36.i = getelementptr inbounds [4 x double]* %B, i64 2, i64 1 45 %10 = load double* %arrayidx36.i, align 8 46 %mul37.i = fmul double %4, %10 47 %add38.i = fadd double %add32.i, %mul37.i 48 %arrayidx42.i = getelementptr inbounds [4 x double]* %B, i64 3, i64 1 49 %11 = load double* %arrayidx42.i, align 8 50 %mul43.i = fmul double %6, %11 51 %add44.i = fadd double %add38.i, %mul43.i 52 %arrayidx49.i = getelementptr inbounds [4 x double]* %B, i64 0, i64 2 53 %12 = load double* %arrayidx49.i, align 8 54 %mul50.i = fmul double %0, %12 55 %arrayidx54.i = getelementptr inbounds [4 x double]* %B, i64 1, i64 2 56 %13 = load double* %arrayidx54.i, align 8 57 %mul55.i = fmul double %2, %13 58 %add56.i = fadd double %mul50.i, %mul55.i 59 %arrayidx60.i = getelementptr inbounds [4 x double]* %B, i64 2, i64 2 60 %14 = load double* %arrayidx60.i, align 8 61 %mul61.i = fmul double %4, %14 62 %add62.i = fadd double %add56.i, %mul61.i 63 %arrayidx66.i = getelementptr inbounds [4 x double]* %B, i64 3, i64 2 64 %15 = load double* %arrayidx66.i, align 8 65 %mul67.i = fmul double %6, %15 66 %add68.i = fadd double %add62.i, %mul67.i 67 %arrayidx73.i = getelementptr inbounds [4 x double]* %B, i64 0, i64 3 68 %16 = load double* %arrayidx73.i, align 8 69 %mul74.i = fmul double %0, %16 70 %arrayidx78.i = getelementptr inbounds [4 x double]* %B, i64 1, i64 3 71 %17 = load double* %arrayidx78.i, align 8 72 %mul79.i = fmul double %2, %17 73 %add80.i = fadd double %mul74.i, %mul79.i 74 %arrayidx84.i = getelementptr inbounds [4 x double]* %B, i64 2, i64 3 75 %18 = load double* %arrayidx84.i, align 8 76 %mul85.i = fmul double %4, %18 77 %add86.i = fadd double %add80.i, %mul85.i 78 %arrayidx90.i = getelementptr inbounds [4 x double]* %B, i64 3, i64 3 79 %19 = load double* %arrayidx90.i, align 8 80 %mul91.i = fmul double %6, %19 81 %add92.i = fadd double %add86.i, %mul91.i 82 %arrayidx95.i = getelementptr inbounds [4 x double]* %A, i64 1, i64 0 83 %20 = load double* %arrayidx95.i, align 8 84 %mul98.i = fmul double %1, %20 85 %arrayidx100.i = getelementptr inbounds [4 x double]* %A, i64 1, i64 1 86 %21 = load double* %arrayidx100.i, align 8 87 %mul103.i = fmul double %3, %21 88 %add104.i = fadd double %mul98.i, %mul103.i 89 %arrayidx106.i = getelementptr inbounds [4 x double]* %A, i64 1, i64 2 90 %22 = load double* %arrayidx106.i, align 8 91 %mul109.i = fmul double %5, %22 92 %add110.i = fadd double %add104.i, %mul109.i 93 %arrayidx112.i = getelementptr inbounds [4 x double]* %A, i64 1, i64 3 94 %23 = load double* %arrayidx112.i, align 8 95 %mul115.i = fmul double %7, %23 96 %add116.i = fadd double %add110.i, %mul115.i 97 %mul122.i = fmul double %8, %20 98 %mul127.i = fmul double %9, %21 99 %add128.i = fadd double %mul122.i, %mul127.i 100 %mul133.i = fmul double %10, %22 101 %add134.i = fadd double %add128.i, %mul133.i 102 %mul139.i = fmul double %11, %23 103 %add140.i = fadd double %add134.i, %mul139.i 104 %mul146.i = fmul double %12, %20 105 %mul151.i = fmul double %13, %21 106 %add152.i = fadd double %mul146.i, %mul151.i 107 %mul157.i = fmul double %14, %22 108 %add158.i = fadd double %add152.i, %mul157.i 109 %mul163.i = fmul double %15, %23 110 %add164.i = fadd double %add158.i, %mul163.i 111 %mul170.i = fmul double %16, %20 112 %mul175.i = fmul double %17, %21 113 %add176.i = fadd double %mul170.i, %mul175.i 114 %mul181.i = fmul double %18, %22 115 %add182.i = fadd double %add176.i, %mul181.i 116 %mul187.i = fmul double %19, %23 117 %add188.i = fadd double %add182.i, %mul187.i 118 %arrayidx191.i = getelementptr inbounds [4 x double]* %A, i64 2, i64 0 119 %24 = load double* %arrayidx191.i, align 8 120 %mul194.i = fmul double %1, %24 121 %arrayidx196.i = getelementptr inbounds [4 x double]* %A, i64 2, i64 1 122 %25 = load double* %arrayidx196.i, align 8 123 %mul199.i = fmul double %3, %25 124 %add200.i = fadd double %mul194.i, %mul199.i 125 %arrayidx202.i = getelementptr inbounds [4 x double]* %A, i64 2, i64 2 126 %26 = load double* %arrayidx202.i, align 8 127 %mul205.i = fmul double %5, %26 128 %add206.i = fadd double %add200.i, %mul205.i 129 %arrayidx208.i = getelementptr inbounds [4 x double]* %A, i64 2, i64 3 130 %27 = load double* %arrayidx208.i, align 8 131 %mul211.i = fmul double %7, %27 132 %add212.i = fadd double %add206.i, %mul211.i 133 %mul218.i = fmul double %8, %24 134 %mul223.i = fmul double %9, %25 135 %add224.i = fadd double %mul218.i, %mul223.i 136 %mul229.i = fmul double %10, %26 137 %add230.i = fadd double %add224.i, %mul229.i 138 %mul235.i = fmul double %11, %27 139 %add236.i = fadd double %add230.i, %mul235.i 140 %mul242.i = fmul double %12, %24 141 %mul247.i = fmul double %13, %25 142 %add248.i = fadd double %mul242.i, %mul247.i 143 %mul253.i = fmul double %14, %26 144 %add254.i = fadd double %add248.i, %mul253.i 145 %mul259.i = fmul double %15, %27 146 %add260.i = fadd double %add254.i, %mul259.i 147 %mul266.i = fmul double %16, %24 148 %mul271.i = fmul double %17, %25 149 %add272.i = fadd double %mul266.i, %mul271.i 150 %mul277.i = fmul double %18, %26 151 %add278.i = fadd double %add272.i, %mul277.i 152 %mul283.i = fmul double %19, %27 153 %add284.i = fadd double %add278.i, %mul283.i 154 %arrayidx287.i = getelementptr inbounds [4 x double]* %A, i64 3, i64 0 155 %28 = load double* %arrayidx287.i, align 8 156 %mul290.i = fmul double %1, %28 157 %arrayidx292.i = getelementptr inbounds [4 x double]* %A, i64 3, i64 1 158 %29 = load double* %arrayidx292.i, align 8 159 %mul295.i = fmul double %3, %29 160 %add296.i = fadd double %mul290.i, %mul295.i 161 %arrayidx298.i = getelementptr inbounds [4 x double]* %A, i64 3, i64 2 162 %30 = load double* %arrayidx298.i, align 8 163 %mul301.i = fmul double %5, %30 164 %add302.i = fadd double %add296.i, %mul301.i 165 %arrayidx304.i = getelementptr inbounds [4 x double]* %A, i64 3, i64 3 166 %31 = load double* %arrayidx304.i, align 8 167 %mul307.i = fmul double %7, %31 168 %add308.i = fadd double %add302.i, %mul307.i 169 %mul314.i = fmul double %8, %28 170 %mul319.i = fmul double %9, %29 171 %add320.i = fadd double %mul314.i, %mul319.i 172 %mul325.i = fmul double %10, %30 173 %add326.i = fadd double %add320.i, %mul325.i 174 %mul331.i = fmul double %11, %31 175 %add332.i = fadd double %add326.i, %mul331.i 176 %mul338.i = fmul double %12, %28 177 %mul343.i = fmul double %13, %29 178 %add344.i = fadd double %mul338.i, %mul343.i 179 %mul349.i = fmul double %14, %30 180 %add350.i = fadd double %add344.i, %mul349.i 181 %mul355.i = fmul double %15, %31 182 %add356.i = fadd double %add350.i, %mul355.i 183 %mul362.i = fmul double %16, %28 184 %mul367.i = fmul double %17, %29 185 %add368.i = fadd double %mul362.i, %mul367.i 186 %mul373.i = fmul double %18, %30 187 %add374.i = fadd double %add368.i, %mul373.i 188 %mul379.i = fmul double %19, %31 189 %add380.i = fadd double %add374.i, %mul379.i 190 store double %add20.i, double* %Out, align 8 191 %Res.i.sroa.1.8.idx2 = getelementptr inbounds double* %Out, i64 1 192 store double %add44.i, double* %Res.i.sroa.1.8.idx2, align 8 193 %Res.i.sroa.2.16.idx4 = getelementptr inbounds double* %Out, i64 2 194 store double %add68.i, double* %Res.i.sroa.2.16.idx4, align 8 195 %Res.i.sroa.3.24.idx6 = getelementptr inbounds double* %Out, i64 3 196 store double %add92.i, double* %Res.i.sroa.3.24.idx6, align 8 197 %Res.i.sroa.4.32.idx8 = getelementptr inbounds double* %Out, i64 4 198 store double %add116.i, double* %Res.i.sroa.4.32.idx8, align 8 199 %Res.i.sroa.5.40.idx10 = getelementptr inbounds double* %Out, i64 5 200 store double %add140.i, double* %Res.i.sroa.5.40.idx10, align 8 201 %Res.i.sroa.6.48.idx12 = getelementptr inbounds double* %Out, i64 6 202 store double %add164.i, double* %Res.i.sroa.6.48.idx12, align 8 203 %Res.i.sroa.7.56.idx14 = getelementptr inbounds double* %Out, i64 7 204 store double %add188.i, double* %Res.i.sroa.7.56.idx14, align 8 205 %Res.i.sroa.8.64.idx16 = getelementptr inbounds double* %Out, i64 8 206 store double %add212.i, double* %Res.i.sroa.8.64.idx16, align 8 207 %Res.i.sroa.9.72.idx18 = getelementptr inbounds double* %Out, i64 9 208 store double %add236.i, double* %Res.i.sroa.9.72.idx18, align 8 209 %Res.i.sroa.10.80.idx20 = getelementptr inbounds double* %Out, i64 10 210 store double %add260.i, double* %Res.i.sroa.10.80.idx20, align 8 211 %Res.i.sroa.11.88.idx22 = getelementptr inbounds double* %Out, i64 11 212 store double %add284.i, double* %Res.i.sroa.11.88.idx22, align 8 213 %Res.i.sroa.12.96.idx24 = getelementptr inbounds double* %Out, i64 12 214 store double %add308.i, double* %Res.i.sroa.12.96.idx24, align 8 215 %Res.i.sroa.13.104.idx26 = getelementptr inbounds double* %Out, i64 13 216 store double %add332.i, double* %Res.i.sroa.13.104.idx26, align 8 217 %Res.i.sroa.14.112.idx28 = getelementptr inbounds double* %Out, i64 14 218 store double %add356.i, double* %Res.i.sroa.14.112.idx28, align 8 219 %Res.i.sroa.15.120.idx30 = getelementptr inbounds double* %Out, i64 15 220 store double %add380.i, double* %Res.i.sroa.15.120.idx30, align 8 221 ret void 222 } 223 224 attributes #0 = { noinline nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } 225