diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index cb3ddaf2a5a..feb3c8556ac 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -41,6 +41,9 @@ const ( inlineExtraCallCost = inlineMaxBudget // default is do not inline, -l=4 enables by using 1 instead. inlineExtraPanicCost = 1 // do not penalize inlining panics. inlineExtraThrowCost = inlineMaxBudget // with current (2018-05/1.11) code, inlining runtime.throw does not help. + + inlineBigFunctionNodes = 5000 // Functions with this many nodes are considered "big". + inlineBigFunctionMaxCost = 20 // Max cost of inlinee when inlining into a "big" function. ) // Get the function's package. For ordinary functions it's on the ->sym, but for imported methods @@ -459,12 +462,38 @@ func inlcopy(n *Node) *Node { return m } +func countNodes(n *Node) int { + if n == nil { + return 0 + } + cnt := 1 + cnt += countNodes(n.Left) + cnt += countNodes(n.Right) + for _, n1 := range n.Ninit.Slice() { + cnt += countNodes(n1) + } + for _, n1 := range n.Nbody.Slice() { + cnt += countNodes(n1) + } + for _, n1 := range n.List.Slice() { + cnt += countNodes(n1) + } + for _, n1 := range n.Rlist.Slice() { + cnt += countNodes(n1) + } + return cnt +} + // Inlcalls/nodelist/node walks fn's statements and expressions and substitutes any // calls made to inlineable functions. This is the external entry point. func inlcalls(fn *Node) { savefn := Curfn Curfn = fn - fn = inlnode(fn) + maxCost := int32(inlineMaxBudget) + if countNodes(fn) >= inlineBigFunctionNodes { + maxCost = inlineBigFunctionMaxCost + } + fn = inlnode(fn, maxCost) if fn != Curfn { Fatalf("inlnode replaced curfn") } @@ -505,10 +534,10 @@ func inlconv2list(n *Node) []*Node { return s } -func inlnodelist(l Nodes) { +func inlnodelist(l Nodes, maxCost int32) { s := l.Slice() for i := range s { - s[i] = inlnode(s[i]) + s[i] = inlnode(s[i], maxCost) } } @@ -525,7 +554,7 @@ func inlnodelist(l Nodes) { // shorter and less complicated. // The result of inlnode MUST be assigned back to n, e.g. // n.Left = inlnode(n.Left) -func inlnode(n *Node) *Node { +func inlnode(n *Node, maxCost int32) *Node { if n == nil { return n } @@ -547,19 +576,19 @@ func inlnode(n *Node) *Node { lno := setlineno(n) - inlnodelist(n.Ninit) + inlnodelist(n.Ninit, maxCost) for _, n1 := range n.Ninit.Slice() { if n1.Op == OINLCALL { inlconv2stmt(n1) } } - n.Left = inlnode(n.Left) + n.Left = inlnode(n.Left, maxCost) if n.Left != nil && n.Left.Op == OINLCALL { n.Left = inlconv2expr(n.Left) } - n.Right = inlnode(n.Right) + n.Right = inlnode(n.Right, maxCost) if n.Right != nil && n.Right.Op == OINLCALL { if n.Op == OFOR || n.Op == OFORUNTIL { inlconv2stmt(n.Right) @@ -568,7 +597,7 @@ func inlnode(n *Node) *Node { } } - inlnodelist(n.List) + inlnodelist(n.List, maxCost) switch n.Op { case OBLOCK: for _, n2 := range n.List.Slice() { @@ -595,7 +624,7 @@ func inlnode(n *Node) *Node { } } - inlnodelist(n.Rlist) + inlnodelist(n.Rlist, maxCost) if n.Op == OAS2FUNC && n.Rlist.First().Op == OINLCALL { n.Rlist.Set(inlconv2list(n.Rlist.First())) n.Op = OAS2 @@ -614,7 +643,7 @@ func inlnode(n *Node) *Node { } } - inlnodelist(n.Nbody) + inlnodelist(n.Nbody, maxCost) for _, n := range n.Nbody.Slice() { if n.Op == OINLCALL { inlconv2stmt(n) @@ -637,12 +666,12 @@ func inlnode(n *Node) *Node { fmt.Printf("%v:call to func %+v\n", n.Line(), n.Left) } if n.Left.Func != nil && n.Left.Func.Inl != nil && !isIntrinsicCall(n) { // normal case - n = mkinlcall(n, n.Left) + n = mkinlcall(n, n.Left, maxCost) } else if n.Left.isMethodExpression() && asNode(n.Left.Sym.Def) != nil { - n = mkinlcall(n, asNode(n.Left.Sym.Def)) + n = mkinlcall(n, asNode(n.Left.Sym.Def), maxCost) } else if n.Left.Op == OCLOSURE { if f := inlinableClosure(n.Left); f != nil { - n = mkinlcall(n, f) + n = mkinlcall(n, f, maxCost) } } else if n.Left.Op == ONAME && n.Left.Name != nil && n.Left.Name.Defn != nil { if d := n.Left.Name.Defn; d.Op == OAS && d.Right.Op == OCLOSURE { @@ -668,7 +697,7 @@ func inlnode(n *Node) *Node { } break } - n = mkinlcall(n, f) + n = mkinlcall(n, f, maxCost) } } } @@ -687,7 +716,7 @@ func inlnode(n *Node) *Node { Fatalf("no function definition for [%p] %+v\n", n.Left.Type, n.Left.Type) } - n = mkinlcall(n, asNode(n.Left.Type.FuncType().Nname)) + n = mkinlcall(n, asNode(n.Left.Type.FuncType().Nname), maxCost) } lineno = lno @@ -788,7 +817,7 @@ func (v *reassignVisitor) visitList(l Nodes) *Node { // The result of mkinlcall MUST be assigned back to n, e.g. // n.Left = mkinlcall(n.Left, fn, isddd) -func mkinlcall(n *Node, fn *Node) *Node { +func mkinlcall(n *Node, fn *Node, maxCost int32) *Node { save_safemode := safemode // imported functions may refer to unsafe as long as the @@ -798,7 +827,7 @@ func mkinlcall(n *Node, fn *Node) *Node { if pkg != localpkg && pkg != nil { safemode = false } - n = mkinlcall1(n, fn) + n = mkinlcall1(n, fn, maxCost) safemode = save_safemode return n } @@ -824,11 +853,16 @@ var inlgen int // parameters. // The result of mkinlcall1 MUST be assigned back to n, e.g. // n.Left = mkinlcall1(n.Left, fn, isddd) -func mkinlcall1(n, fn *Node) *Node { +func mkinlcall1(n, fn *Node, maxCost int32) *Node { if fn.Func.Inl == nil { // No inlinable body. return n } + if fn.Func.Inl.Cost > maxCost { + // The inlined function body is too big. Typically we use this check to restrict + // inlining into very big functions. See issue 26546 and 17566. + return n + } if fn == Curfn || fn.Name.Defn == Curfn { // Can't recursively inline a function into itself. @@ -1094,7 +1128,7 @@ func mkinlcall1(n, fn *Node) *Node { // instead we emit the things that the body needs // and each use must redo the inlining. // luckily these are small. - inlnodelist(call.Nbody) + inlnodelist(call.Nbody, maxCost) for _, n := range call.Nbody.Slice() { if n.Op == OINLCALL { inlconv2stmt(n) diff --git a/test/inline_big.go b/test/inline_big.go new file mode 100644 index 00000000000..c4af15b4e10 --- /dev/null +++ b/test/inline_big.go @@ -0,0 +1,1029 @@ +// errorcheck -0 -m=2 + +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test that we restrict inlining into very large functions. +// See issue #26546. + +package foo + +func small(a []int) int { // ERROR "can inline small as:.*" "small a does not escape" + // Cost 16 body (need cost < 20). + // See cmd/compile/internal/gc/inl.go:inlineBigFunction* + return a[0] + a[1] + a[2] + a[3] +} +func medium(a []int) int { // ERROR "can inline medium as:.*" "medium a does not escape" + // Cost 32 body (need cost > 20 and cost < 80). + // See cmd/compile/internal/gc/inl.go:inlineBigFunction* + return a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] +} + +func f(a []int) int { // ERROR "cannot inline f:.*" "f a does not escape" + // Add lots of nodes to f's body. We need >5000. + // See cmd/compile/internal/gc/inl.go:inlineBigFunction* + a[0] = 0 + a[1] = 0 + a[2] = 0 + a[3] = 0 + a[4] = 0 + a[5] = 0 + a[6] = 0 + a[7] = 0 + a[8] = 0 + a[9] = 0 + a[10] = 0 + a[11] = 0 + a[12] = 0 + a[13] = 0 + a[14] = 0 + a[15] = 0 + a[16] = 0 + a[17] = 0 + a[18] = 0 + a[19] = 0 + a[20] = 0 + a[21] = 0 + a[22] = 0 + a[23] = 0 + a[24] = 0 + a[25] = 0 + a[26] = 0 + a[27] = 0 + a[28] = 0 + a[29] = 0 + a[30] = 0 + a[31] = 0 + a[32] = 0 + a[33] = 0 + a[34] = 0 + a[35] = 0 + a[36] = 0 + a[37] = 0 + a[38] = 0 + a[39] = 0 + a[40] = 0 + a[41] = 0 + a[42] = 0 + a[43] = 0 + a[44] = 0 + a[45] = 0 + a[46] = 0 + a[47] = 0 + a[48] = 0 + a[49] = 0 + a[50] = 0 + a[51] = 0 + a[52] = 0 + a[53] = 0 + a[54] = 0 + a[55] = 0 + a[56] = 0 + a[57] = 0 + a[58] = 0 + a[59] = 0 + a[60] = 0 + a[61] = 0 + a[62] = 0 + a[63] = 0 + a[64] = 0 + a[65] = 0 + a[66] = 0 + a[67] = 0 + a[68] = 0 + a[69] = 0 + a[70] = 0 + a[71] = 0 + a[72] = 0 + a[73] = 0 + a[74] = 0 + a[75] = 0 + a[76] = 0 + a[77] = 0 + a[78] = 0 + a[79] = 0 + a[80] = 0 + a[81] = 0 + a[82] = 0 + a[83] = 0 + a[84] = 0 + a[85] = 0 + a[86] = 0 + a[87] = 0 + a[88] = 0 + a[89] = 0 + a[90] = 0 + a[91] = 0 + a[92] = 0 + a[93] = 0 + a[94] = 0 + a[95] = 0 + a[96] = 0 + a[97] = 0 + a[98] = 0 + a[99] = 0 + a[100] = 0 + a[101] = 0 + a[102] = 0 + a[103] = 0 + a[104] = 0 + a[105] = 0 + a[106] = 0 + a[107] = 0 + a[108] = 0 + a[109] = 0 + a[110] = 0 + a[111] = 0 + a[112] = 0 + a[113] = 0 + a[114] = 0 + a[115] = 0 + a[116] = 0 + a[117] = 0 + a[118] = 0 + a[119] = 0 + a[120] = 0 + a[121] = 0 + a[122] = 0 + a[123] = 0 + a[124] = 0 + a[125] = 0 + a[126] = 0 + a[127] = 0 + a[128] = 0 + a[129] = 0 + a[130] = 0 + a[131] = 0 + a[132] = 0 + a[133] = 0 + a[134] = 0 + a[135] = 0 + a[136] = 0 + a[137] = 0 + a[138] = 0 + a[139] = 0 + a[140] = 0 + a[141] = 0 + a[142] = 0 + a[143] = 0 + a[144] = 0 + a[145] = 0 + a[146] = 0 + a[147] = 0 + a[148] = 0 + a[149] = 0 + a[150] = 0 + a[151] = 0 + a[152] = 0 + a[153] = 0 + a[154] = 0 + a[155] = 0 + a[156] = 0 + a[157] = 0 + a[158] = 0 + a[159] = 0 + a[160] = 0 + a[161] = 0 + a[162] = 0 + a[163] = 0 + a[164] = 0 + a[165] = 0 + a[166] = 0 + a[167] = 0 + a[168] = 0 + a[169] = 0 + a[170] = 0 + a[171] = 0 + a[172] = 0 + a[173] = 0 + a[174] = 0 + a[175] = 0 + a[176] = 0 + a[177] = 0 + a[178] = 0 + a[179] = 0 + a[180] = 0 + a[181] = 0 + a[182] = 0 + a[183] = 0 + a[184] = 0 + a[185] = 0 + a[186] = 0 + a[187] = 0 + a[188] = 0 + a[189] = 0 + a[190] = 0 + a[191] = 0 + a[192] = 0 + a[193] = 0 + a[194] = 0 + a[195] = 0 + a[196] = 0 + a[197] = 0 + a[198] = 0 + a[199] = 0 + a[200] = 0 + a[201] = 0 + a[202] = 0 + a[203] = 0 + a[204] = 0 + a[205] = 0 + a[206] = 0 + a[207] = 0 + a[208] = 0 + a[209] = 0 + a[210] = 0 + a[211] = 0 + a[212] = 0 + a[213] = 0 + a[214] = 0 + a[215] = 0 + a[216] = 0 + a[217] = 0 + a[218] = 0 + a[219] = 0 + a[220] = 0 + a[221] = 0 + a[222] = 0 + a[223] = 0 + a[224] = 0 + a[225] = 0 + a[226] = 0 + a[227] = 0 + a[228] = 0 + a[229] = 0 + a[230] = 0 + a[231] = 0 + a[232] = 0 + a[233] = 0 + a[234] = 0 + a[235] = 0 + a[236] = 0 + a[237] = 0 + a[238] = 0 + a[239] = 0 + a[240] = 0 + a[241] = 0 + a[242] = 0 + a[243] = 0 + a[244] = 0 + a[245] = 0 + a[246] = 0 + a[247] = 0 + a[248] = 0 + a[249] = 0 + a[250] = 0 + a[251] = 0 + a[252] = 0 + a[253] = 0 + a[254] = 0 + a[255] = 0 + a[256] = 0 + a[257] = 0 + a[258] = 0 + a[259] = 0 + a[260] = 0 + a[261] = 0 + a[262] = 0 + a[263] = 0 + a[264] = 0 + a[265] = 0 + a[266] = 0 + a[267] = 0 + a[268] = 0 + a[269] = 0 + a[270] = 0 + a[271] = 0 + a[272] = 0 + a[273] = 0 + a[274] = 0 + a[275] = 0 + a[276] = 0 + a[277] = 0 + a[278] = 0 + a[279] = 0 + a[280] = 0 + a[281] = 0 + a[282] = 0 + a[283] = 0 + a[284] = 0 + a[285] = 0 + a[286] = 0 + a[287] = 0 + a[288] = 0 + a[289] = 0 + a[290] = 0 + a[291] = 0 + a[292] = 0 + a[293] = 0 + a[294] = 0 + a[295] = 0 + a[296] = 0 + a[297] = 0 + a[298] = 0 + a[299] = 0 + a[300] = 0 + a[301] = 0 + a[302] = 0 + a[303] = 0 + a[304] = 0 + a[305] = 0 + a[306] = 0 + a[307] = 0 + a[308] = 0 + a[309] = 0 + a[310] = 0 + a[311] = 0 + a[312] = 0 + a[313] = 0 + a[314] = 0 + a[315] = 0 + a[316] = 0 + a[317] = 0 + a[318] = 0 + a[319] = 0 + a[320] = 0 + a[321] = 0 + a[322] = 0 + a[323] = 0 + a[324] = 0 + a[325] = 0 + a[326] = 0 + a[327] = 0 + a[328] = 0 + a[329] = 0 + a[330] = 0 + a[331] = 0 + a[332] = 0 + a[333] = 0 + a[334] = 0 + a[335] = 0 + a[336] = 0 + a[337] = 0 + a[338] = 0 + a[339] = 0 + a[340] = 0 + a[341] = 0 + a[342] = 0 + a[343] = 0 + a[344] = 0 + a[345] = 0 + a[346] = 0 + a[347] = 0 + a[348] = 0 + a[349] = 0 + a[350] = 0 + a[351] = 0 + a[352] = 0 + a[353] = 0 + a[354] = 0 + a[355] = 0 + a[356] = 0 + a[357] = 0 + a[358] = 0 + a[359] = 0 + a[360] = 0 + a[361] = 0 + a[362] = 0 + a[363] = 0 + a[364] = 0 + a[365] = 0 + a[366] = 0 + a[367] = 0 + a[368] = 0 + a[369] = 0 + a[370] = 0 + a[371] = 0 + a[372] = 0 + a[373] = 0 + a[374] = 0 + a[375] = 0 + a[376] = 0 + a[377] = 0 + a[378] = 0 + a[379] = 0 + a[380] = 0 + a[381] = 0 + a[382] = 0 + a[383] = 0 + a[384] = 0 + a[385] = 0 + a[386] = 0 + a[387] = 0 + a[388] = 0 + a[389] = 0 + a[390] = 0 + a[391] = 0 + a[392] = 0 + a[393] = 0 + a[394] = 0 + a[395] = 0 + a[396] = 0 + a[397] = 0 + a[398] = 0 + a[399] = 0 + a[400] = 0 + a[401] = 0 + a[402] = 0 + a[403] = 0 + a[404] = 0 + a[405] = 0 + a[406] = 0 + a[407] = 0 + a[408] = 0 + a[409] = 0 + a[410] = 0 + a[411] = 0 + a[412] = 0 + a[413] = 0 + a[414] = 0 + a[415] = 0 + a[416] = 0 + a[417] = 0 + a[418] = 0 + a[419] = 0 + a[420] = 0 + a[421] = 0 + a[422] = 0 + a[423] = 0 + a[424] = 0 + a[425] = 0 + a[426] = 0 + a[427] = 0 + a[428] = 0 + a[429] = 0 + a[430] = 0 + a[431] = 0 + a[432] = 0 + a[433] = 0 + a[434] = 0 + a[435] = 0 + a[436] = 0 + a[437] = 0 + a[438] = 0 + a[439] = 0 + a[440] = 0 + a[441] = 0 + a[442] = 0 + a[443] = 0 + a[444] = 0 + a[445] = 0 + a[446] = 0 + a[447] = 0 + a[448] = 0 + a[449] = 0 + a[450] = 0 + a[451] = 0 + a[452] = 0 + a[453] = 0 + a[454] = 0 + a[455] = 0 + a[456] = 0 + a[457] = 0 + a[458] = 0 + a[459] = 0 + a[460] = 0 + a[461] = 0 + a[462] = 0 + a[463] = 0 + a[464] = 0 + a[465] = 0 + a[466] = 0 + a[467] = 0 + a[468] = 0 + a[469] = 0 + a[470] = 0 + a[471] = 0 + a[472] = 0 + a[473] = 0 + a[474] = 0 + a[475] = 0 + a[476] = 0 + a[477] = 0 + a[478] = 0 + a[479] = 0 + a[480] = 0 + a[481] = 0 + a[482] = 0 + a[483] = 0 + a[484] = 0 + a[485] = 0 + a[486] = 0 + a[487] = 0 + a[488] = 0 + a[489] = 0 + a[490] = 0 + a[491] = 0 + a[492] = 0 + a[493] = 0 + a[494] = 0 + a[495] = 0 + a[496] = 0 + a[497] = 0 + a[498] = 0 + a[499] = 0 + a[500] = 0 + a[501] = 0 + a[502] = 0 + a[503] = 0 + a[504] = 0 + a[505] = 0 + a[506] = 0 + a[507] = 0 + a[508] = 0 + a[509] = 0 + a[510] = 0 + a[511] = 0 + a[512] = 0 + a[513] = 0 + a[514] = 0 + a[515] = 0 + a[516] = 0 + a[517] = 0 + a[518] = 0 + a[519] = 0 + a[520] = 0 + a[521] = 0 + a[522] = 0 + a[523] = 0 + a[524] = 0 + a[525] = 0 + a[526] = 0 + a[527] = 0 + a[528] = 0 + a[529] = 0 + a[530] = 0 + a[531] = 0 + a[532] = 0 + a[533] = 0 + a[534] = 0 + a[535] = 0 + a[536] = 0 + a[537] = 0 + a[538] = 0 + a[539] = 0 + a[540] = 0 + a[541] = 0 + a[542] = 0 + a[543] = 0 + a[544] = 0 + a[545] = 0 + a[546] = 0 + a[547] = 0 + a[548] = 0 + a[549] = 0 + a[550] = 0 + a[551] = 0 + a[552] = 0 + a[553] = 0 + a[554] = 0 + a[555] = 0 + a[556] = 0 + a[557] = 0 + a[558] = 0 + a[559] = 0 + a[560] = 0 + a[561] = 0 + a[562] = 0 + a[563] = 0 + a[564] = 0 + a[565] = 0 + a[566] = 0 + a[567] = 0 + a[568] = 0 + a[569] = 0 + a[570] = 0 + a[571] = 0 + a[572] = 0 + a[573] = 0 + a[574] = 0 + a[575] = 0 + a[576] = 0 + a[577] = 0 + a[578] = 0 + a[579] = 0 + a[580] = 0 + a[581] = 0 + a[582] = 0 + a[583] = 0 + a[584] = 0 + a[585] = 0 + a[586] = 0 + a[587] = 0 + a[588] = 0 + a[589] = 0 + a[590] = 0 + a[591] = 0 + a[592] = 0 + a[593] = 0 + a[594] = 0 + a[595] = 0 + a[596] = 0 + a[597] = 0 + a[598] = 0 + a[599] = 0 + a[600] = 0 + a[601] = 0 + a[602] = 0 + a[603] = 0 + a[604] = 0 + a[605] = 0 + a[606] = 0 + a[607] = 0 + a[608] = 0 + a[609] = 0 + a[610] = 0 + a[611] = 0 + a[612] = 0 + a[613] = 0 + a[614] = 0 + a[615] = 0 + a[616] = 0 + a[617] = 0 + a[618] = 0 + a[619] = 0 + a[620] = 0 + a[621] = 0 + a[622] = 0 + a[623] = 0 + a[624] = 0 + a[625] = 0 + a[626] = 0 + a[627] = 0 + a[628] = 0 + a[629] = 0 + a[630] = 0 + a[631] = 0 + a[632] = 0 + a[633] = 0 + a[634] = 0 + a[635] = 0 + a[636] = 0 + a[637] = 0 + a[638] = 0 + a[639] = 0 + a[640] = 0 + a[641] = 0 + a[642] = 0 + a[643] = 0 + a[644] = 0 + a[645] = 0 + a[646] = 0 + a[647] = 0 + a[648] = 0 + a[649] = 0 + a[650] = 0 + a[651] = 0 + a[652] = 0 + a[653] = 0 + a[654] = 0 + a[655] = 0 + a[656] = 0 + a[657] = 0 + a[658] = 0 + a[659] = 0 + a[660] = 0 + a[661] = 0 + a[662] = 0 + a[663] = 0 + a[664] = 0 + a[665] = 0 + a[666] = 0 + a[667] = 0 + a[668] = 0 + a[669] = 0 + a[670] = 0 + a[671] = 0 + a[672] = 0 + a[673] = 0 + a[674] = 0 + a[675] = 0 + a[676] = 0 + a[677] = 0 + a[678] = 0 + a[679] = 0 + a[680] = 0 + a[681] = 0 + a[682] = 0 + a[683] = 0 + a[684] = 0 + a[685] = 0 + a[686] = 0 + a[687] = 0 + a[688] = 0 + a[689] = 0 + a[690] = 0 + a[691] = 0 + a[692] = 0 + a[693] = 0 + a[694] = 0 + a[695] = 0 + a[696] = 0 + a[697] = 0 + a[698] = 0 + a[699] = 0 + a[700] = 0 + a[701] = 0 + a[702] = 0 + a[703] = 0 + a[704] = 0 + a[705] = 0 + a[706] = 0 + a[707] = 0 + a[708] = 0 + a[709] = 0 + a[710] = 0 + a[711] = 0 + a[712] = 0 + a[713] = 0 + a[714] = 0 + a[715] = 0 + a[716] = 0 + a[717] = 0 + a[718] = 0 + a[719] = 0 + a[720] = 0 + a[721] = 0 + a[722] = 0 + a[723] = 0 + a[724] = 0 + a[725] = 0 + a[726] = 0 + a[727] = 0 + a[728] = 0 + a[729] = 0 + a[730] = 0 + a[731] = 0 + a[732] = 0 + a[733] = 0 + a[734] = 0 + a[735] = 0 + a[736] = 0 + a[737] = 0 + a[738] = 0 + a[739] = 0 + a[740] = 0 + a[741] = 0 + a[742] = 0 + a[743] = 0 + a[744] = 0 + a[745] = 0 + a[746] = 0 + a[747] = 0 + a[748] = 0 + a[749] = 0 + a[750] = 0 + a[751] = 0 + a[752] = 0 + a[753] = 0 + a[754] = 0 + a[755] = 0 + a[756] = 0 + a[757] = 0 + a[758] = 0 + a[759] = 0 + a[760] = 0 + a[761] = 0 + a[762] = 0 + a[763] = 0 + a[764] = 0 + a[765] = 0 + a[766] = 0 + a[767] = 0 + a[768] = 0 + a[769] = 0 + a[770] = 0 + a[771] = 0 + a[772] = 0 + a[773] = 0 + a[774] = 0 + a[775] = 0 + a[776] = 0 + a[777] = 0 + a[778] = 0 + a[779] = 0 + a[780] = 0 + a[781] = 0 + a[782] = 0 + a[783] = 0 + a[784] = 0 + a[785] = 0 + a[786] = 0 + a[787] = 0 + a[788] = 0 + a[789] = 0 + a[790] = 0 + a[791] = 0 + a[792] = 0 + a[793] = 0 + a[794] = 0 + a[795] = 0 + a[796] = 0 + a[797] = 0 + a[798] = 0 + a[799] = 0 + a[800] = 0 + a[801] = 0 + a[802] = 0 + a[803] = 0 + a[804] = 0 + a[805] = 0 + a[806] = 0 + a[807] = 0 + a[808] = 0 + a[809] = 0 + a[810] = 0 + a[811] = 0 + a[812] = 0 + a[813] = 0 + a[814] = 0 + a[815] = 0 + a[816] = 0 + a[817] = 0 + a[818] = 0 + a[819] = 0 + a[820] = 0 + a[821] = 0 + a[822] = 0 + a[823] = 0 + a[824] = 0 + a[825] = 0 + a[826] = 0 + a[827] = 0 + a[828] = 0 + a[829] = 0 + a[830] = 0 + a[831] = 0 + a[832] = 0 + a[833] = 0 + a[834] = 0 + a[835] = 0 + a[836] = 0 + a[837] = 0 + a[838] = 0 + a[839] = 0 + a[840] = 0 + a[841] = 0 + a[842] = 0 + a[843] = 0 + a[844] = 0 + a[845] = 0 + a[846] = 0 + a[847] = 0 + a[848] = 0 + a[849] = 0 + a[850] = 0 + a[851] = 0 + a[852] = 0 + a[853] = 0 + a[854] = 0 + a[855] = 0 + a[856] = 0 + a[857] = 0 + a[858] = 0 + a[859] = 0 + a[860] = 0 + a[861] = 0 + a[862] = 0 + a[863] = 0 + a[864] = 0 + a[865] = 0 + a[866] = 0 + a[867] = 0 + a[868] = 0 + a[869] = 0 + a[870] = 0 + a[871] = 0 + a[872] = 0 + a[873] = 0 + a[874] = 0 + a[875] = 0 + a[876] = 0 + a[877] = 0 + a[878] = 0 + a[879] = 0 + a[880] = 0 + a[881] = 0 + a[882] = 0 + a[883] = 0 + a[884] = 0 + a[885] = 0 + a[886] = 0 + a[887] = 0 + a[888] = 0 + a[889] = 0 + a[890] = 0 + a[891] = 0 + a[892] = 0 + a[893] = 0 + a[894] = 0 + a[895] = 0 + a[896] = 0 + a[897] = 0 + a[898] = 0 + a[899] = 0 + a[900] = 0 + a[901] = 0 + a[902] = 0 + a[903] = 0 + a[904] = 0 + a[905] = 0 + a[906] = 0 + a[907] = 0 + a[908] = 0 + a[909] = 0 + a[910] = 0 + a[911] = 0 + a[912] = 0 + a[913] = 0 + a[914] = 0 + a[915] = 0 + a[916] = 0 + a[917] = 0 + a[918] = 0 + a[919] = 0 + a[920] = 0 + a[921] = 0 + a[922] = 0 + a[923] = 0 + a[924] = 0 + a[925] = 0 + a[926] = 0 + a[927] = 0 + a[928] = 0 + a[929] = 0 + a[930] = 0 + a[931] = 0 + a[932] = 0 + a[933] = 0 + a[934] = 0 + a[935] = 0 + a[936] = 0 + a[937] = 0 + a[938] = 0 + a[939] = 0 + a[940] = 0 + a[941] = 0 + a[942] = 0 + a[943] = 0 + a[944] = 0 + a[945] = 0 + a[946] = 0 + a[947] = 0 + a[948] = 0 + a[949] = 0 + a[950] = 0 + a[951] = 0 + a[952] = 0 + a[953] = 0 + a[954] = 0 + a[955] = 0 + a[956] = 0 + a[957] = 0 + a[958] = 0 + a[959] = 0 + a[960] = 0 + a[961] = 0 + a[962] = 0 + a[963] = 0 + a[964] = 0 + a[965] = 0 + a[966] = 0 + a[967] = 0 + a[968] = 0 + a[969] = 0 + a[970] = 0 + a[971] = 0 + a[972] = 0 + a[973] = 0 + a[974] = 0 + a[975] = 0 + a[976] = 0 + a[977] = 0 + a[978] = 0 + a[979] = 0 + a[980] = 0 + a[981] = 0 + a[982] = 0 + a[983] = 0 + a[984] = 0 + a[985] = 0 + a[986] = 0 + a[987] = 0 + a[988] = 0 + a[989] = 0 + a[990] = 0 + a[991] = 0 + a[992] = 0 + a[993] = 0 + a[994] = 0 + a[995] = 0 + a[996] = 0 + a[997] = 0 + a[998] = 0 + a[999] = 0 + x := small(a) // ERROR "inlining call to small .*" + y := medium(a) // The crux of this test: medium is not inlined. + return x + y +}