# Copyright (C) 2015 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. .class public LTestCmp; .super Ljava/lang/Object; ## CHECK-START: int TestCmp.$opt$CmpLongConstants() constant_folding (before) ## CHECK-DAG: <> LongConstant 13 ## CHECK-DAG: <> LongConstant 7 ## CHECK-DAG: <> Compare [<>,<>] ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLongConstants() constant_folding (after) ## CHECK-DAG: LongConstant 13 ## CHECK-DAG: LongConstant 7 ## CHECK-DAG: <> IntConstant 1 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLongConstants() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpLongConstants()I .registers 5 const-wide v1, 13 const-wide v3, 7 cmp-long v0, v1, v3 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpGtFloatConstants() constant_folding (before) ## CHECK-DAG: <> FloatConstant 11 ## CHECK-DAG: <> FloatConstant 22 ## CHECK-DAG: <> Compare [<>,<>] bias:gt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtFloatConstants() constant_folding (after) ## CHECK-DAG: FloatConstant 11 ## CHECK-DAG: FloatConstant 22 ## CHECK-DAG: <> IntConstant -1 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtFloatConstants() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpGtFloatConstants()I .registers 3 const v1, 11.f const v2, 22.f cmpg-float v0, v1, v2 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpLtFloatConstants() constant_folding (before) ## CHECK-DAG: <> FloatConstant 33 ## CHECK-DAG: <> FloatConstant 44 ## CHECK-DAG: <> Compare [<>,<>] bias:lt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtFloatConstants() constant_folding (after) ## CHECK-DAG: FloatConstant 33 ## CHECK-DAG: FloatConstant 44 ## CHECK-DAG: <> IntConstant -1 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtFloatConstants() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpLtFloatConstants()I .registers 3 const v1, 33.f const v2, 44.f cmpl-float v0, v1, v2 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpGtDoubleConstants() constant_folding (before) ## CHECK-DAG: <> DoubleConstant 55 ## CHECK-DAG: <> DoubleConstant 66 ## CHECK-DAG: <> Compare [<>,<>] bias:gt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtDoubleConstants() constant_folding (after) ## CHECK-DAG: DoubleConstant 55 ## CHECK-DAG: DoubleConstant 66 ## CHECK-DAG: <> IntConstant -1 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtDoubleConstants() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpGtDoubleConstants()I .registers 5 const-wide v1, 55. const-wide v3, 66. cmpg-double v0, v1, v3 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpLtDoubleConstants() constant_folding (before) ## CHECK-DAG: <> DoubleConstant 77 ## CHECK-DAG: <> DoubleConstant 88 ## CHECK-DAG: <> Compare [<>,<>] bias:lt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtDoubleConstants() constant_folding (after) ## CHECK-DAG: DoubleConstant 77 ## CHECK-DAG: DoubleConstant 88 ## CHECK-DAG: <> IntConstant -1 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtDoubleConstants() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpLtDoubleConstants()I .registers 5 const-wide v1, 77. const-wide v3, 88. cmpl-double v0, v1, v3 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpLongSameConstant() constant_folding (before) ## CHECK-DAG: <> LongConstant 100 ## CHECK-DAG: <> Compare [<>,<>] ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLongSameConstant() constant_folding (after) ## CHECK-DAG: LongConstant 100 ## CHECK-DAG: <> IntConstant 0 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLongSameConstant() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpLongSameConstant()I .registers 5 const-wide v1, 100 const-wide v3, 100 cmp-long v0, v1, v3 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpGtFloatSameConstant() constant_folding (before) ## CHECK-DAG: <> FloatConstant 200 ## CHECK-DAG: <> Compare [<>,<>] bias:gt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtFloatSameConstant() constant_folding (after) ## CHECK-DAG: FloatConstant 200 ## CHECK-DAG: <> IntConstant 0 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtFloatSameConstant() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpGtFloatSameConstant()I .registers 3 const v1, 200.f const v2, 200.f cmpg-float v0, v1, v2 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpLtFloatSameConstant() constant_folding (before) ## CHECK-DAG: <> FloatConstant 300 ## CHECK-DAG: <> Compare [<>,<>] bias:lt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtFloatSameConstant() constant_folding (after) ## CHECK-DAG: FloatConstant 300 ## CHECK-DAG: <> IntConstant 0 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtFloatSameConstant() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpLtFloatSameConstant()I .registers 3 const v1, 300.f const v2, 300.f cmpl-float v0, v1, v2 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpGtDoubleSameConstant() constant_folding (before) ## CHECK-DAG: <> DoubleConstant 400 ## CHECK-DAG: <> Compare [<>,<>] bias:gt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtDoubleSameConstant() constant_folding (after) ## CHECK-DAG: DoubleConstant 400 ## CHECK-DAG: <> IntConstant 0 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtDoubleSameConstant() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpGtDoubleSameConstant()I .registers 5 const-wide v1, 400. const-wide v3, 400. cmpg-double v0, v1, v3 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpLtDoubleSameConstant() constant_folding (before) ## CHECK-DAG: <> DoubleConstant 500 ## CHECK-DAG: <> Compare [<>,<>] bias:lt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtDoubleSameConstant() constant_folding (after) ## CHECK-DAG: DoubleConstant 500 ## CHECK-DAG: <> IntConstant 0 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtDoubleSameConstant() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpLtDoubleSameConstant()I .registers 5 const-wide v1, 500. const-wide v3, 500. cmpl-double v0, v1, v3 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpGtFloatConstantWithNaN() constant_folding (before) ## CHECK-DAG: <> FloatConstant 44 ## CHECK-DAG: <> FloatConstant nan ## CHECK-DAG: <> Compare [<>,<>] bias:gt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtFloatConstantWithNaN() constant_folding (after) ## CHECK-DAG: FloatConstant 44 ## CHECK-DAG: FloatConstant nan ## CHECK-DAG: <> IntConstant 1 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtFloatConstantWithNaN() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpGtFloatConstantWithNaN()I .registers 3 const v1, 44.f const v2, NaNf cmpg-float v0, v1, v2 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpLtFloatConstantWithNaN() constant_folding (before) ## CHECK-DAG: <> FloatConstant 44 ## CHECK-DAG: <> FloatConstant nan ## CHECK-DAG: <> Compare [<>,<>] bias:lt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtFloatConstantWithNaN() constant_folding (after) ## CHECK-DAG: FloatConstant 44 ## CHECK-DAG: FloatConstant nan ## CHECK-DAG: <> IntConstant -1 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtFloatConstantWithNaN() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpLtFloatConstantWithNaN()I .registers 3 const v1, 44.f const v2, NaNf cmpl-float v0, v1, v2 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpGtDoubleConstantWithNaN() constant_folding (before) ## CHECK-DAG: <> DoubleConstant 45 ## CHECK-DAG: <> DoubleConstant nan ## CHECK-DAG: <> Compare [<>,<>] bias:gt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtDoubleConstantWithNaN() constant_folding (after) ## CHECK-DAG: DoubleConstant 45 ## CHECK-DAG: DoubleConstant nan ## CHECK-DAG: <> IntConstant 1 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpGtDoubleConstantWithNaN() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpGtDoubleConstantWithNaN()I .registers 5 const-wide v1, 45. const-wide v3, NaN cmpg-double v0, v1, v3 return v0 .end method ## CHECK-START: int TestCmp.$opt$CmpLtDoubleConstantWithNaN() constant_folding (before) ## CHECK-DAG: <> DoubleConstant 46 ## CHECK-DAG: <> DoubleConstant nan ## CHECK-DAG: <> Compare [<>,<>] bias:lt ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtDoubleConstantWithNaN() constant_folding (after) ## CHECK-DAG: DoubleConstant 46 ## CHECK-DAG: DoubleConstant nan ## CHECK-DAG: <> IntConstant -1 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.$opt$CmpLtDoubleConstantWithNaN() constant_folding (after) ## CHECK-NOT: Compare .method public static $opt$CmpLtDoubleConstantWithNaN()I .registers 5 const-wide v1, 46. const-wide v3, NaN cmpl-double v0, v1, v3 return v0 .end method ## CHECK-START: int TestCmp.IntAddition2() constant_folding (before) ## CHECK-DAG: <> IntConstant 1 ## CHECK-DAG: <> IntConstant 2 ## CHECK-DAG: <> IntConstant 5 ## CHECK-DAG: <> IntConstant 6 ## CHECK-DAG: <> Add [<>,<>] ## CHECK-DAG: <> Add [<>,<>] ## CHECK-DAG: <> Add [<>,<>] ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.IntAddition2() constant_folding (after) ## CHECK-DAG: <> IntConstant 14 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.IntAddition2() constant_folding (after) ## CHECK-NOT: Add .method public static IntAddition2()I # A more direct translation from Java. # int a, b, c; .registers 3 # a = 1; const/4 v0, 1 # b = 2; const/4 v1, 2 # a += b; add-int/2addr v0, v1 # b = 5; const/4 v1, 5 # c = 6; const/4 v2, 6 # b += c; add-int/2addr v1, v2 # c = a + b; add-int v2, v0, v1 # return c; return v2 .end method ## CHECK-START: int TestCmp.IntAddition2AddAndMove() constant_folding (before) ## CHECK-DAG: <> IntConstant 1 ## CHECK-DAG: <> IntConstant 2 ## CHECK-DAG: <> IntConstant 5 ## CHECK-DAG: <> IntConstant 6 ## CHECK-DAG: <> Add [<>,<>] ## CHECK-DAG: <> Add [<>,<>] ## CHECK-DAG: <> Add [<>,<>] ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.IntAddition2AddAndMove() constant_folding (after) ## CHECK-DAG: <> IntConstant 14 ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.IntAddition2AddAndMove() constant_folding (after) ## CHECK-NOT: Add # D8 uses 3 registers for += when local variable info is presented. .method public static IntAddition2AddAndMove()I .registers 4 # a = 1; const/4 v0, 1 # b = 2; const/4 v1, 2 # a += b; add-int v2, v0, v1 move v0, v2 # b = 5; const/4 v2, 5 move v1, v2 # c = 6; const/4 v2, 6 # b += c; add-int v3, v1, v2 move v1, v3 # c = a + b; add-int v3, v0, v1 move v2, v3 # return c; return v2 .end method ## CHECK-START: int TestCmp.JumpsAndConditionals(boolean) constant_folding (before) ## CHECK-DAG: <> IntConstant 2 ## CHECK-DAG: <> IntConstant 5 ## CHECK-DAG: <> Add [<>,<>] ## CHECK-DAG: <> Sub [<>,<>] ## CHECK-DAG: <> Phi [<>,<>] ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.JumpsAndConditionals(boolean) constant_folding (after) ## CHECK-DAG: <> IntConstant 3 ## CHECK-DAG: <> IntConstant 7 ## CHECK-DAG: <> Phi [<>,<>] ## CHECK-DAG: Return [<>] ## CHECK-START: int TestCmp.JumpsAndConditionals(boolean) constant_folding (after) ## CHECK-NOT: Add ## CHECK-NOT: Sub .method public static JumpsAndConditionals(Z)I # int a, b, c; # a = 5; # b = 2; # if (cond) # c = a + b; # else # c = a - b; # return c; .registers 4 const/4 v0, 5 const/4 v1, 2 if-eqz p0, :cond_7 add-int v2, v0, v1 :goto_6 return v2 :cond_7 sub-int v2, v0, v1 goto :goto_6 .end method