< prev index next >

test/testlibrary/jittester/src/jdk/test/lib/jittester/factories/SwitchFactory.java

Print this page




  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 package jdk.test.lib.jittester.factories;
  25 
  26 import java.util.ArrayList;
  27 import java.util.HashSet;
  28 import java.util.List;
  29 import jdk.test.lib.jittester.BuiltInType;
  30 import jdk.test.lib.jittester.IRNode;
  31 import jdk.test.lib.jittester.Literal;
  32 import jdk.test.lib.jittester.Nothing;
  33 import jdk.test.lib.jittester.ProductionFailedException;
  34 import jdk.test.lib.jittester.Rule;
  35 import jdk.test.lib.jittester.Switch;
  36 import jdk.test.lib.jittester.Type;
  37 import jdk.test.lib.jittester.TypeUtil;
  38 import jdk.test.lib.jittester.types.TypeKlass;
  39 import jdk.test.lib.jittester.types.TypeByte;
  40 import jdk.test.lib.jittester.types.TypeChar;
  41 import jdk.test.lib.jittester.types.TypeInt;
  42 import jdk.test.lib.jittester.types.TypeShort;
  43 import jdk.test.lib.jittester.utils.PseudoRandom;
  44 
  45 class SwitchFactory extends SafeFactory {
  46     private int caseBlockIdx;
  47     protected long complexityLimit;
  48     protected int statementLimit, operatorLimit;
  49     private boolean canHaveReturn = false;
  50     private final TypeKlass ownerClass;
  51     private final int level;
  52 
  53     SwitchFactory(TypeKlass ownerClass, long complexityLimit, int statementLimit,
  54             int operatorLimit, int level, boolean canHaveReturn) {
  55         this.ownerClass = ownerClass;
  56         this.complexityLimit = complexityLimit;
  57         this.statementLimit = statementLimit;
  58         this.operatorLimit = operatorLimit;
  59         this.level = level;
  60         this.canHaveReturn = canHaveReturn;
  61     }
  62 
  63     @Override
  64     protected IRNode sproduce() throws ProductionFailedException {
  65         if (statementLimit > 0 && complexityLimit > 0) {
  66             ArrayList<Type> switchTypes = new ArrayList<>();
  67             switchTypes.add(new TypeChar());
  68             switchTypes.add(new TypeByte());
  69             switchTypes.add(new TypeShort());
  70             switchTypes.add(new TypeInt());
  71             PseudoRandom.shuffle(switchTypes);
  72             IRNodeBuilder builder = new IRNodeBuilder()
  73                     .setOwnerKlass(ownerClass)
  74                     .setOperatorLimit(operatorLimit)
  75                     .setSubBlock(false)
  76                     .setCanHaveBreaks(true)
  77                     .setCanHaveContinues(false)
  78                     .setCanHaveReturn(canHaveReturn);
  79             MAIN_LOOP:
  80             for (Type type : switchTypes) {
  81                 ArrayList<IRNode> caseConsts = new ArrayList<>();
  82                 ArrayList<IRNode> caseBlocks = new ArrayList<>();
  83                 try {
  84                     int accumulatedStatements = 0;
  85                     int currentStatementsLimit = 0;
  86                     long accumulatedComplexity = 0L;
  87                     long currentComplexityLimit = 0L;
  88                     currentComplexityLimit = (long) (PseudoRandom.random()
  89                             * (complexityLimit - accumulatedComplexity));
  90                     IRNode switchExp = builder.setComplexityLimit(currentComplexityLimit)
  91                             .setResultType(type)
  92                             .setExceptionSafe(false)
  93                             .setNoConsts(true)
  94                             .getLimitedExpressionFactory()
  95                             .produce();
  96                     accumulatedComplexity += currentComplexityLimit;
  97                     ArrayList<Type> caseTypes = new ArrayList<>();
  98                     caseTypes.add(new TypeByte());
  99                     caseTypes.add(new TypeChar());
 100                     caseTypes = new ArrayList<>(TypeUtil.getLessCapatiousOrEqualThan(caseTypes,
 101                             (BuiltInType) type));
 102                     if (PseudoRandom.randomBoolean()) { // "default"
 103                         currentStatementsLimit = (int) (PseudoRandom.random()
 104                                 * (statementLimit - accumulatedStatements));
 105                         currentComplexityLimit = (long) (PseudoRandom.random()
 106                                 * (complexityLimit - accumulatedComplexity));
 107                         caseConsts.add(null);
 108                         caseBlocks.add(builder.setComplexityLimit(currentComplexityLimit)
 109                                 .setStatementLimit(currentStatementsLimit)
 110                                 .setLevel(level + 1)
 111                                 .setCanHaveReturn(false)
 112                                 .setCanHaveBreaks(false)
 113                                 .getBlockFactory()
 114                                 .produce());
 115                         builder.setCanHaveBreaks(true)
 116                                 .setCanHaveReturn(canHaveReturn);
 117                         accumulatedStatements += currentStatementsLimit;
 118                         accumulatedComplexity += currentComplexityLimit;
 119                     }
 120                     HashSet<Integer> cases = new HashSet<>();




  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 package jdk.test.lib.jittester.factories;
  25 
  26 import java.util.ArrayList;
  27 import java.util.HashSet;
  28 import java.util.List;
  29 import jdk.test.lib.jittester.BuiltInType;
  30 import jdk.test.lib.jittester.IRNode;
  31 import jdk.test.lib.jittester.Literal;
  32 import jdk.test.lib.jittester.Nothing;
  33 import jdk.test.lib.jittester.ProductionFailedException;
  34 import jdk.test.lib.jittester.Rule;
  35 import jdk.test.lib.jittester.Switch;
  36 import jdk.test.lib.jittester.Type;
  37 import jdk.test.lib.jittester.utils.TypeUtil;
  38 import jdk.test.lib.jittester.types.TypeKlass;
  39 import jdk.test.lib.jittester.types.TypeByte;
  40 import jdk.test.lib.jittester.types.TypeChar;
  41 import jdk.test.lib.jittester.types.TypeInt;
  42 import jdk.test.lib.jittester.types.TypeShort;
  43 import jdk.test.lib.jittester.utils.PseudoRandom;
  44 
  45 class SwitchFactory extends SafeFactory {
  46     private int caseBlockIdx;
  47     protected long complexityLimit;
  48     protected int statementLimit, operatorLimit;
  49     private boolean canHaveReturn = false;
  50     private final TypeKlass ownerClass;
  51     private final int level;
  52 
  53     SwitchFactory(TypeKlass ownerClass, long complexityLimit, int statementLimit,
  54             int operatorLimit, int level, boolean canHaveReturn) {
  55         this.ownerClass = ownerClass;
  56         this.complexityLimit = complexityLimit;
  57         this.statementLimit = statementLimit;
  58         this.operatorLimit = operatorLimit;
  59         this.level = level;
  60         this.canHaveReturn = canHaveReturn;
  61     }
  62 
  63     @Override
  64     protected IRNode sproduce() throws ProductionFailedException {
  65         if (statementLimit > 0 && complexityLimit > 0) {
  66             List<Type> switchTypes = new ArrayList<>();
  67             switchTypes.add(new TypeChar());
  68             switchTypes.add(new TypeByte());
  69             switchTypes.add(new TypeShort());
  70             switchTypes.add(new TypeInt());
  71             PseudoRandom.shuffle(switchTypes);
  72             IRNodeBuilder builder = new IRNodeBuilder()
  73                     .setOwnerKlass(ownerClass)
  74                     .setOperatorLimit(operatorLimit)
  75                     .setSubBlock(false)
  76                     .setCanHaveBreaks(true)
  77                     .setCanHaveContinues(false)
  78                     .setCanHaveReturn(canHaveReturn);
  79             MAIN_LOOP:
  80             for (Type type : switchTypes) {
  81                 List<IRNode> caseConsts = new ArrayList<>();
  82                 List<IRNode> caseBlocks = new ArrayList<>();
  83                 try {
  84                     int accumulatedStatements = 0;
  85                     int currentStatementsLimit = 0;
  86                     long accumulatedComplexity = 0L;
  87                     long currentComplexityLimit = 0L;
  88                     currentComplexityLimit = (long) (PseudoRandom.random()
  89                             * (complexityLimit - accumulatedComplexity));
  90                     IRNode switchExp = builder.setComplexityLimit(currentComplexityLimit)
  91                             .setResultType(type)
  92                             .setExceptionSafe(false)
  93                             .setNoConsts(true)
  94                             .getLimitedExpressionFactory()
  95                             .produce();
  96                     accumulatedComplexity += currentComplexityLimit;
  97                     List<Type> caseTypes = new ArrayList<>();
  98                     caseTypes.add(new TypeByte());
  99                     caseTypes.add(new TypeChar());
 100                     caseTypes = new ArrayList<>(TypeUtil.getLessCapaciousOrEqualThan(caseTypes,
 101                             (BuiltInType) type));
 102                     if (PseudoRandom.randomBoolean()) { // "default"
 103                         currentStatementsLimit = (int) (PseudoRandom.random()
 104                                 * (statementLimit - accumulatedStatements));
 105                         currentComplexityLimit = (long) (PseudoRandom.random()
 106                                 * (complexityLimit - accumulatedComplexity));
 107                         caseConsts.add(null);
 108                         caseBlocks.add(builder.setComplexityLimit(currentComplexityLimit)
 109                                 .setStatementLimit(currentStatementsLimit)
 110                                 .setLevel(level + 1)
 111                                 .setCanHaveReturn(false)
 112                                 .setCanHaveBreaks(false)
 113                                 .getBlockFactory()
 114                                 .produce());
 115                         builder.setCanHaveBreaks(true)
 116                                 .setCanHaveReturn(canHaveReturn);
 117                         accumulatedStatements += currentStatementsLimit;
 118                         accumulatedComplexity += currentComplexityLimit;
 119                     }
 120                     HashSet<Integer> cases = new HashSet<>();


< prev index next >