Path: blob/master/test/hotspot/jtreg/compiler/eliminateAutobox/TestFloatBoxing.java
41152 views
/*1* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 693460426* @summary enable parts of EliminateAutoBox by default27*28* @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:+EliminateAutoBox29* compiler.eliminateAutobox.TestFloatBoxing30* @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:+EliminateAutoBox31* -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestFloatBoxing::dummy32* -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestFloatBoxing::foo33* -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestFloatBoxing::foob34* compiler.eliminateAutobox.TestFloatBoxing35* @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-EliminateAutoBox36* -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestFloatBoxing::dummy37* -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestFloatBoxing::foo38* -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestFloatBoxing::foob39* compiler.eliminateAutobox.TestFloatBoxing40*/4142package compiler.eliminateAutobox;4344public class TestFloatBoxing {4546static final Float ibc = new Float(1.f);4748//===============================================49// Non-inlined methods to test deoptimization info50static void dummy() { }51static float foo(float i) { return i; }52static Float foob(float i) { return Float.valueOf(i); }535455static float simple(float i) {56Float ib = new Float(i);57return ib;58}5960static float simpleb(float i) {61Float ib = Float.valueOf(i);62return ib;63}6465static float simplec() {66Float ib = ibc;67return ib;68}6970static float simplef(float i) {71Float ib = foob(i);72return ib;73}7475static float simplep(Float ib) {76return ib;77}7879static float simple2(float i) {80Float ib1 = new Float(i);81Float ib2 = new Float(i+1.f);82return ib1 + ib2;83}8485static float simpleb2(float i) {86Float ib1 = Float.valueOf(i);87Float ib2 = Float.valueOf(i+1.f);88return ib1 + ib2;89}9091static float simplem2(float i) {92Float ib1 = new Float(i);93Float ib2 = Float.valueOf(i+1.f);94return ib1 + ib2;95}9697static float simplep2(float i, Float ib1) {98Float ib2 = Float.valueOf(i+1.f);99return ib1 + ib2;100}101102static float simplec2(float i) {103Float ib1 = ibc;104Float ib2 = Float.valueOf(i+1.f);105return ib1 + ib2;106}107108//===============================================109static float test(float f, int i) {110Float ib = new Float(f);111if ((i&1) == 0)112ib = f+1.f;113return ib;114}115116static float testb(float f, int i) {117Float ib = f;118if ((i&1) == 0)119ib = (f+1.f);120return ib;121}122123static float testm(float f, int i) {124Float ib = f;125if ((i&1) == 0)126ib = new Float(f+1.f);127return ib;128}129130static float testp(float f, int i, Float ib) {131if ((i&1) == 0)132ib = new Float(f+1.f);133return ib;134}135136static float testc(float f, int i) {137Float ib = ibc;138if ((i&1) == 0)139ib = new Float(f+1.f);140return ib;141}142143static float test2(float f, int i) {144Float ib1 = new Float(f);145Float ib2 = new Float(f+1.f);146if ((i&1) == 0) {147ib1 = new Float(f+1.f);148ib2 = new Float(f+2.f);149}150return ib1+ib2;151}152153static float testb2(float f, int i) {154Float ib1 = f;155Float ib2 = f+1.f;156if ((i&1) == 0) {157ib1 = (f+1.f);158ib2 = (f+2.f);159}160return ib1+ib2;161}162163static float testm2(float f, int i) {164Float ib1 = new Float(f);165Float ib2 = f+1.f;166if ((i&1) == 0) {167ib1 = new Float(f+1.f);168ib2 = (f+2.f);169}170return ib1+ib2;171}172173static float testp2(float f, int i, Float ib1) {174Float ib2 = f+1.f;175if ((i&1) == 0) {176ib1 = new Float(f+1.f);177ib2 = (f+2.f);178}179return ib1+ib2;180}181182static float testc2(float f, int i) {183Float ib1 = ibc;184Float ib2 = f+1.f;185if ((i&1) == 0) {186ib1 = (ibc+1.f);187ib2 = (f+2.f);188}189return ib1+ib2;190}191192//===============================================193static float sum(float[] a) {194float result = 1.f;195for (Float i : a)196result += i;197return result;198}199200static float sumb(float[] a) {201Float result = 1.f;202for (Float i : a)203result += i;204return result;205}206207static float sumc(float[] a) {208Float result = ibc;209for (Float i : a)210result += i;211return result;212}213214static float sumf(float[] a) {215Float result = foob(1.f);216for (Float i : a)217result += i;218return result;219}220221static float sump(float[] a, Float result) {222for (Float i : a)223result += i;224return result;225}226227static float sum2(float[] a) {228float result1 = 1.f;229float result2 = 1.f;230for (Float i : a) {231result1 += i;232result2 += i + 1.f;233}234return result1 + result2;235}236237static float sumb2(float[] a) {238Float result1 = 1.f;239Float result2 = 1.f;240for (Float i : a) {241result1 += i;242result2 += i + 1.f;243}244return result1 + result2;245}246247static float summ2(float[] a) {248Float result1 = 1.f;249Float result2 = new Float(1.f);250for (Float i : a) {251result1 += i;252result2 += new Float(i + 1.f);253}254return result1 + result2;255}256257static float sump2(float[] a, Float result2) {258Float result1 = 1.f;259for (Float i : a) {260result1 += i;261result2 += i + 1.f;262}263return result1 + result2;264}265266static float sumc2(float[] a) {267Float result1 = 1.f;268Float result2 = ibc;269for (Float i : a) {270result1 += i;271result2 += i + ibc;272}273return result1 + result2;274}275276//===============================================277static float remi_sum() {278Float j = new Float(1.f);279for (int i = 0; i< 1000; i++) {280j = new Float(j + 1.f);281}282return j;283}284285static float remi_sumb() {286Float j = Float.valueOf(1.f);287for (int i = 0; i< 1000; i++) {288j = j + 1.f;289}290return j;291}292293static float remi_sumf() {294Float j = foob(1.f);295for (int i = 0; i< 1000; i++) {296j = j + 1.f;297}298return j;299}300301static float remi_sump(Float j) {302for (int i = 0; i< 1000; i++) {303j = new Float(j + 1.f);304}305return j;306}307308static float remi_sumc() {309Float j = ibc;310for (int i = 0; i< 1000; i++) {311j = j + ibc;312}313return j;314}315316static float remi_sum2() {317Float j1 = new Float(1.f);318Float j2 = new Float(1.f);319for (int i = 0; i< 1000; i++) {320j1 = new Float(j1 + 1.f);321j2 = new Float(j2 + 2.f);322}323return j1 + j2;324}325326static float remi_sumb2() {327Float j1 = Float.valueOf(1.f);328Float j2 = Float.valueOf(1.f);329for (int i = 0; i< 1000; i++) {330j1 = j1 + 1.f;331j2 = j2 + 2.f;332}333return j1 + j2;334}335336static float remi_summ2() {337Float j1 = new Float(1.f);338Float j2 = Float.valueOf(1.f);339for (int i = 0; i< 1000; i++) {340j1 = new Float(j1 + 1.f);341j2 = j2 + 2.f;342}343return j1 + j2;344}345346static float remi_sump2(Float j1) {347Float j2 = Float.valueOf(1.f);348for (int i = 0; i< 1000; i++) {349j1 = new Float(j1 + 1.f);350j2 = j2 + 2.f;351}352return j1 + j2;353}354355static float remi_sumc2() {356Float j1 = ibc;357Float j2 = Float.valueOf(1.f);358for (int i = 0; i< 1000; i++) {359j1 = j1 + ibc;360j2 = j2 + 2.f;361}362return j1 + j2;363}364365366//===============================================367// Safepointa and debug info for deoptimization368static float simple_deop(float i) {369Float ib = new Float(foo(i));370dummy();371return ib;372}373374static float simpleb_deop(float i) {375Float ib = Float.valueOf(foo(i));376dummy();377return ib;378}379380static float simplef_deop(float i) {381Float ib = foob(i);382dummy();383return ib;384}385386static float simplep_deop(Float ib) {387dummy();388return ib;389}390391static float simplec_deop(float i) {392Float ib = ibc;393dummy();394return ib;395}396397static float test_deop(float f, int i) {398Float ib = new Float(foo(f));399if ((i&1) == 0)400ib = foo(f+1.f);401dummy();402return ib;403}404405static float testb_deop(float f, int i) {406Float ib = foo(f);407if ((i&1) == 0)408ib = foo(f+1.f);409dummy();410return ib;411}412413static float testf_deop(float f, int i) {414Float ib = foob(f);415if ((i&1) == 0)416ib = foo(f+1.f);417dummy();418return ib;419}420421static float testp_deop(float f, int i, Float ib) {422if ((i&1) == 0)423ib = foo(f+1.f);424dummy();425return ib;426}427428static float testc_deop(float f, int i) {429Float ib = ibc;430if ((i&1) == 0)431ib = foo(f+1.f);432dummy();433return ib;434}435436static float sum_deop(float[] a) {437float result = 1.f;438for (Float i : a)439result += foo(i);440dummy();441return result;442}443444static float sumb_deop(float[] a) {445Float result = 1.f;446for (Float i : a)447result += foo(i);448dummy();449return result;450}451452static float sumf_deop(float[] a) {453Float result = 1.f;454for (Float i : a)455result += foob(i);456dummy();457return result;458}459460static float sump_deop(float[] a, Float result) {461for (Float i : a)462result += foob(i);463dummy();464return result;465}466467static float sumc_deop(float[] a) {468Float result = ibc;469for (Float i : a)470result += foo(i);471dummy();472return result;473}474475static float remi_sum_deop() {476Float j = new Float(foo(1.f));477for (int i = 0; i< 1000; i++) {478j = new Float(foo(j + 1.f));479}480dummy();481return j;482}483484static float remi_sumb_deop() {485Float j = Float.valueOf(foo(1.f));486for (int i = 0; i< 1000; i++) {487j = foo(j + 1.f);488}489dummy();490return j;491}492493static float remi_sumf_deop() {494Float j = foob(1.f);495for (int i = 0; i< 1000; i++) {496j = foo(j + 1.f);497}498dummy();499return j;500}501502static float remi_sump_deop(Float j) {503for (int i = 0; i< 1000; i++) {504j = foo(j + 1.f);505}506dummy();507return j;508}509510static float remi_sumc_deop() {511Float j = ibc;512for (int i = 0; i< 1000; i++) {513j = foo(j + 1.f);514}515dummy();516return j;517}518519//===============================================520// Conditional increment521static float remi_sum_cond() {522Float j = new Float(1.f);523for (int i = 0; i< 1000; i++) {524if ((i&1) == 0) {525j = new Float(j + 1.f);526}527}528return j;529}530531static float remi_sumb_cond() {532Float j = Float.valueOf(1.f);533for (int i = 0; i< 1000; i++) {534if ((i&1) == 0) {535j = j + 1.f;536}537}538return j;539}540541static float remi_sumf_cond() {542Float j = foob(1.f);543for (int i = 0; i< 1000; i++) {544if ((i&1) == 0) {545j = j + 1.f;546}547}548return j;549}550551static float remi_sump_cond(Float j) {552for (int i = 0; i< 1000; i++) {553if ((i&1) == 0) {554j = j + 1.f;555}556}557return j;558}559560static float remi_sumc_cond() {561Float j = ibc;562for (int i = 0; i< 1000; i++) {563if ((i&1) == 0) {564j = j + ibc;565}566}567return j;568}569570static float remi_sum2_cond() {571Float j1 = new Float(1.f);572Float j2 = new Float(1.f);573for (int i = 0; i< 1000; i++) {574if ((i&1) == 0) {575j1 = new Float(j1 + 1.f);576} else {577j2 = new Float(j2 + 2.f);578}579}580return j1 + j2;581}582583static float remi_sumb2_cond() {584Float j1 = Float.valueOf(1.f);585Float j2 = Float.valueOf(1.f);586for (int i = 0; i< 1000; i++) {587if ((i&1) == 0) {588j1 = j1 + 1.f;589} else {590j2 = j2 + 2.f;591}592}593return j1 + j2;594}595596static float remi_summ2_cond() {597Float j1 = new Float(1.f);598Float j2 = Float.valueOf(1.f);599for (int i = 0; i< 1000; i++) {600if ((i&1) == 0) {601j1 = new Float(j1 + 1.f);602} else {603j2 = j2 + 2.f;604}605}606return j1 + j2;607}608609static float remi_sump2_cond(Float j1) {610Float j2 = Float.valueOf(1.f);611for (int i = 0; i< 1000; i++) {612if ((i&1) == 0) {613j1 = new Float(j1 + 1.f);614} else {615j2 = j2 + 2.f;616}617}618return j1 + j2;619}620621static float remi_sumc2_cond() {622Float j1 = ibc;623Float j2 = Float.valueOf(1.f);624for (int i = 0; i< 1000; i++) {625if ((i&1) == 0) {626j1 = j1 + ibc;627} else {628j2 = j2 + 2;629}630}631return j1 + j2;632}633634635public static void main(String[] args) {636final int ntests = 70;637638String[] test_name = new String[] {639"simple", "simpleb", "simplec", "simplef", "simplep",640"simple2", "simpleb2", "simplec2", "simplem2", "simplep2",641"simple_deop", "simpleb_deop", "simplec_deop", "simplef_deop", "simplep_deop",642"test", "testb", "testc", "testm", "testp",643"test2", "testb2", "testc2", "testm2", "testp2",644"test_deop", "testb_deop", "testc_deop", "testf_deop", "testp_deop",645"sum", "sumb", "sumc", "sumf", "sump",646"sum2", "sumb2", "sumc2", "summ2", "sump2",647"sum_deop", "sumb_deop", "sumc_deop", "sumf_deop", "sump_deop",648"remi_sum", "remi_sumb", "remi_sumc", "remi_sumf", "remi_sump",649"remi_sum2", "remi_sumb2", "remi_sumc2", "remi_summ2", "remi_sump2",650"remi_sum_deop", "remi_sumb_deop", "remi_sumc_deop", "remi_sumf_deop", "remi_sump_deop",651"remi_sum_cond", "remi_sumb_cond", "remi_sumc_cond", "remi_sumf_cond", "remi_sump_cond",652"remi_sum2_cond", "remi_sumb2_cond", "remi_sumc2_cond", "remi_summ2_cond", "remi_sump2_cond"653};654655final float[] val = new float[] {65671990896.f, 71990896.f, 12000.f, 71990896.f, 71990896.f,657144000000.f, 144000000.f, 72014896.f, 144000000.f, 144000000.f,65871990896.f, 71990896.f, 12000.f, 71990896.f, 71990896.f,65972000000.f, 72000000.f, 36004096.f, 72000000.f, 72000000.f,660144012288.f, 144012288.f, 72033096.f, 144012288.f, 144012288.f,66172000000.f, 72000000.f, 36004096.f, 72000000.f, 72000000.f,662499501.f, 499501.f, 499501.f, 499501.f, 499501.f,6631000002.f, 1000002.f, 1000002.f, 1000002.f, 1000002.f,664499501.f, 499501.f, 499501.f, 499501.f, 499501.f,6651001.f, 1001.f, 1001.f, 1001.f, 1001.f,6663002.f, 3002.f, 3002.f, 3002.f, 3002.f,6671001.f, 1001.f, 1001.f, 1001.f, 1001.f,668501.f, 501.f, 501.f, 501.f, 501.f,6691502.f, 1502.f, 1502.f, 1502.f, 1502.f670};671672float[] res = new float[ntests];673for (int i = 0; i < ntests; i++) {674res[i] = 0.f;675}676677678for (int i = 0; i < 12000; i++) {679res[0] += simple(i);680res[1] += simpleb(i);681res[2] += simplec();682res[3] += simplef(i);683res[4] += simplep((float)i);684685res[5] += simple2((float)i);686res[6] += simpleb2((float)i);687res[7] += simplec2((float)i);688res[8] += simplem2((float)i);689res[9] += simplep2((float)i, (float)i);690691res[10] += simple_deop((float)i);692res[11] += simpleb_deop((float)i);693res[12] += simplec_deop((float)i);694res[13] += simplef_deop((float)i);695res[14] += simplep_deop((float)i);696697res[15] += test((float)i, i);698res[16] += testb((float)i, i);699res[17] += testc((float)i, i);700res[18] += testm((float)i, i);701res[19] += testp((float)i, i, (float)i);702703res[20] += test2((float)i, i);704res[21] += testb2((float)i, i);705res[22] += testc2((float)i, i);706res[23] += testm2((float)i, i);707res[24] += testp2((float)i, i, (float)i);708709res[25] += test_deop((float)i, i);710res[26] += testb_deop((float)i, i);711res[27] += testc_deop((float)i, i);712res[28] += testf_deop((float)i, i);713res[29] += testp_deop((float)i, i, (float)i);714}715716float[] ia = new float[1000];717for (int i = 0; i < 1000; i++) {718ia[i] = i;719}720721for (int i = 0; i < 100; i++) {722res[30] = sum(ia);723res[31] = sumb(ia);724res[32] = sumc(ia);725res[33] = sumf(ia);726res[34] = sump(ia, 1.f);727728res[35] = sum2(ia);729res[36] = sumb2(ia);730res[37] = sumc2(ia);731res[38] = summ2(ia);732res[39] = sump2(ia, 1.f);733734res[40] = sum_deop(ia);735res[41] = sumb_deop(ia);736res[42] = sumc_deop(ia);737res[43] = sumf_deop(ia);738res[44] = sump_deop(ia, 1.f);739740res[45] = remi_sum();741res[46] = remi_sumb();742res[47] = remi_sumc();743res[48] = remi_sumf();744res[49] = remi_sump(1.f);745746res[50] = remi_sum2();747res[51] = remi_sumb2();748res[52] = remi_sumc2();749res[53] = remi_summ2();750res[54] = remi_sump2(1.f);751752res[55] = remi_sum_deop();753res[56] = remi_sumb_deop();754res[57] = remi_sumc_deop();755res[58] = remi_sumf_deop();756res[59] = remi_sump_deop(1.f);757758res[60] = remi_sum_cond();759res[61] = remi_sumb_cond();760res[62] = remi_sumc_cond();761res[63] = remi_sumf_cond();762res[64] = remi_sump_cond(1.f);763764res[65] = remi_sum2_cond();765res[66] = remi_sumb2_cond();766res[67] = remi_sumc2_cond();767res[68] = remi_summ2_cond();768res[69] = remi_sump2_cond(1.f);769}770771int failed = 0;772for (int i = 0; i < ntests; i++) {773if (res[i] != val[i]) {774System.err.println(test_name[i] + ": " + res[i] + " != " + val[i]);775failed++;776}777}778if (failed > 0) {779System.err.println("Failed " + failed + " tests.");780throw new InternalError();781} else {782System.out.println("Passed.");783}784}785}786787788