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