mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-08-09 04:25:12 +00:00
Prepared for constant condition interval analysis
This commit is contained in:
@@ -37,27 +37,8 @@ public class Pass2ConstantIfs extends Pass2SsaOptimization {
|
|||||||
while(stmtIt.hasNext()) {
|
while(stmtIt.hasNext()) {
|
||||||
Statement statement = stmtIt.next();
|
Statement statement = stmtIt.next();
|
||||||
if(statement instanceof StatementConditionalJump) {
|
if(statement instanceof StatementConditionalJump) {
|
||||||
ConstantLiteral literal = null;
|
|
||||||
StatementConditionalJump conditional = (StatementConditionalJump) statement;
|
StatementConditionalJump conditional = (StatementConditionalJump) statement;
|
||||||
ConstantValue constValue1 = Pass2ConstantIdentification.getConstant(conditional.getrValue1());
|
ConstantLiteral literal = getConditionLiteralValue(conditional);
|
||||||
Operator operator = conditional.getOperator();
|
|
||||||
ConstantValue constValue2 = Pass2ConstantIdentification.getConstant(conditional.getrValue2());
|
|
||||||
try {
|
|
||||||
if(conditional.getrValue1() == null && operator == null && constValue2 != null) {
|
|
||||||
// Constant condition
|
|
||||||
literal = constValue2.calculateLiteral(getScope());
|
|
||||||
} else if(conditional.getrValue1() == null && operator != null && constValue2 != null) {
|
|
||||||
// Constant unary condition
|
|
||||||
ConstantValue constVal = Pass2ConstantIdentification.createUnary((OperatorUnary) operator, constValue2);
|
|
||||||
literal = constVal.calculateLiteral(getScope());
|
|
||||||
} else if(constValue1 != null && operator != null && constValue2 != null) {
|
|
||||||
// Constant binary condition
|
|
||||||
ConstantValue constVal = Pass2ConstantIdentification.createBinary(constValue1, (OperatorBinary) operator, constValue2, getScope());
|
|
||||||
literal = constVal.calculateLiteral(getScope());
|
|
||||||
}
|
|
||||||
} catch (ConstantNotLiteral e) {
|
|
||||||
// not literal - keep as null
|
|
||||||
}
|
|
||||||
if(literal!=null && literal instanceof ConstantBool) {
|
if(literal!=null && literal instanceof ConstantBool) {
|
||||||
// Condition is a constant boolean
|
// Condition is a constant boolean
|
||||||
if(((ConstantBool) literal).getBool()) {
|
if(((ConstantBool) literal).getBool()) {
|
||||||
@@ -83,4 +64,43 @@ public class Pass2ConstantIfs extends Pass2SsaOptimization {
|
|||||||
return modified;
|
return modified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the condition always evaluates to constant true or false this finds tha value.
|
||||||
|
* @param conditional The conditional
|
||||||
|
* @return The literal value of the condition
|
||||||
|
*/
|
||||||
|
private ConstantLiteral getConditionLiteralValue(StatementConditionalJump conditional) {
|
||||||
|
ConstantValue constValue1 = Pass2ConstantIdentification.getConstant(conditional.getrValue1());
|
||||||
|
Operator operator = conditional.getOperator();
|
||||||
|
ConstantValue constValue2 = Pass2ConstantIdentification.getConstant(conditional.getrValue2());
|
||||||
|
try {
|
||||||
|
|
||||||
|
// If all values are constant find the literal condition value
|
||||||
|
|
||||||
|
if(conditional.getrValue1() == null && operator == null && constValue2 != null) {
|
||||||
|
// Constant condition
|
||||||
|
return constValue2.calculateLiteral(getScope());
|
||||||
|
} else if(conditional.getrValue1() == null && operator != null && constValue2 != null) {
|
||||||
|
// Constant unary condition
|
||||||
|
ConstantValue constVal = Pass2ConstantIdentification.createUnary((OperatorUnary) operator, constValue2);
|
||||||
|
return constVal.calculateLiteral(getScope());
|
||||||
|
} else if(constValue1 != null && operator != null && constValue2 != null) {
|
||||||
|
// Constant binary condition
|
||||||
|
ConstantValue constVal = Pass2ConstantIdentification.createBinary(constValue1, (OperatorBinary) operator, constValue2, getScope());
|
||||||
|
return constVal.calculateLiteral(getScope());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Examine the intervals of the comparison parameters
|
||||||
|
|
||||||
|
// TODO: Compare intervals based on the operator
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} catch (ConstantNotLiteral e) {
|
||||||
|
// not literal - keep as null
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user