Skip to content

Commit

Permalink
Merge branch 'master' into fix/deprecate-record-field-40363
Browse files Browse the repository at this point in the history
  • Loading branch information
dulajdilshan committed Aug 14, 2023
2 parents 5dc6764 + 446f250 commit 3f153e0
Show file tree
Hide file tree
Showing 58 changed files with 1,657 additions and 315 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1542,6 +1542,7 @@ public void visit(BLangLiteral astLiteralExpr) {

@Override
public void visit(BLangMapLiteral astMapLiteralExpr) {
this.env.isInArrayOrStructure++;
visitTypedesc(astMapLiteralExpr.pos, astMapLiteralExpr.getBType(), Collections.emptyList());
BIRVariableDcl tempVarDcl =
new BIRVariableDcl(astMapLiteralExpr.getBType(), this.env.nextLocalVarId(names),
Expand All @@ -1552,6 +1553,7 @@ public void visit(BLangMapLiteral astMapLiteralExpr) {
setScopeAndEmit(new BIRNonTerminator.NewStructure(astMapLiteralExpr.pos, toVarRef, this.env.targetOperand,
generateMappingConstructorEntries(astMapLiteralExpr.fields)));
this.env.targetOperand = toVarRef;
this.env.isInArrayOrStructure--;
}

@Override
Expand All @@ -1572,6 +1574,7 @@ public void visit(BLangTypeConversionExpr astTypeConversionExpr) {

@Override
public void visit(BLangStructLiteral astStructLiteralExpr) {
this.env.isInArrayOrStructure++;
List<BIROperand> varDcls = mapToVarDcls(astStructLiteralExpr.enclMapSymbols);
BType type = astStructLiteralExpr.getBType();
visitTypedesc(astStructLiteralExpr.pos, type, varDcls);
Expand All @@ -1588,6 +1591,7 @@ public void visit(BLangStructLiteral astStructLiteralExpr) {
setScopeAndEmit(instruction);

this.env.targetOperand = toVarRef;
this.env.isInArrayOrStructure--;
}

private List<BIROperand> mapToVarDcls(TreeMap<Integer, BVarSymbol> enclMapSymbols) {
Expand Down Expand Up @@ -1838,14 +1842,17 @@ public void visit(BLangPackageVarRef astPackageVarRefExpr) {
setScopeAndEmit(new Move(astPackageVarRefExpr.pos, this.env.targetOperand, varRef));
}
} else {
BIRVariableDcl tempVarDcl = new BIRVariableDcl(astPackageVarRefExpr.getBType(),
this.env.nextLocalVarId(names), VarScope.FUNCTION,
VarKind.TEMP);
this.env.enclFunc.localVars.add(tempVarDcl);
BIROperand tempVarRef = new BIROperand(tempVarDcl);
BIROperand fromVarRef = new BIROperand(getVarRef(astPackageVarRefExpr));
setScopeAndEmit(new Move(astPackageVarRefExpr.pos, fromVarRef, tempVarRef));
this.env.targetOperand = tempVarRef;
if (this.env.isInArrayOrStructure > 0) {
BIRVariableDcl tempVarDcl = new BIRVariableDcl(astPackageVarRefExpr.getBType(),
this.env.nextLocalVarId(names), VarScope.FUNCTION, VarKind.TEMP);
this.env.enclFunc.localVars.add(tempVarDcl);
BIROperand tempVarRef = new BIROperand(tempVarDcl);
BIROperand fromVarRef = new BIROperand(getVarRef(astPackageVarRefExpr));
setScopeAndEmit(new Move(astPackageVarRefExpr.pos, fromVarRef, tempVarRef));
this.env.targetOperand = tempVarRef;
} else {
this.env.targetOperand = new BIROperand(getVarRef(astPackageVarRefExpr));
}
}
this.varAssignment = variableStore;
}
Expand Down Expand Up @@ -1942,6 +1949,7 @@ public void visit(BLangWaitExpr waitExpr) {

@Override
public void visit(BLangWaitForAllExpr.BLangWaitLiteral waitLiteral) {
this.env.isInArrayOrStructure++;
visitTypedesc(waitLiteral.pos, waitLiteral.getBType(), Collections.emptyList());
BIRBasicBlock thenBB = new BIRBasicBlock(this.env.nextBBId());
addToTrapStack(thenBB);
Expand All @@ -1966,6 +1974,7 @@ public void visit(BLangWaitForAllExpr.BLangWaitLiteral waitLiteral) {
this.env.targetOperand = toVarRef;
this.env.enclFunc.basicBlocks.add(thenBB);
this.env.enclBB = thenBB;
this.env.isInArrayOrStructure--;
}

@Override
Expand Down Expand Up @@ -2646,6 +2655,7 @@ private InstructionKind getUnaryInstructionKind(OperatorKind opKind) {
}

private void generateListConstructorExpr(BLangListConstructorExpr listConstructorExpr) {
this.env.isInArrayOrStructure++;
// Emit create array instruction
BIRVariableDcl tempVarDcl = new BIRVariableDcl(listConstructorExpr.getBType(), this.env.nextLocalVarId(names),
VarScope.FUNCTION, VarKind.TEMP);
Expand Down Expand Up @@ -2695,6 +2705,7 @@ private void generateListConstructorExpr(BLangListConstructorExpr listConstructo
initialValues));
}
this.env.targetOperand = toVarRef;
this.env.isInArrayOrStructure--;
}

private void generateArrayAccess(BLangIndexBasedAccess astArrayAccessExpr) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ class BIRGenEnv {
// A function can have only one basic block that has a return instruction.
BIRBasicBlock returnBB;

// This is to hold whether a NewArray or NewStructure instruction is being constructed
int isInArrayOrStructure = 0;

BIRGenEnv(BIRPackage birPkg) {
this.enclPkg = birPkg;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.wso2.ballerinalang.compiler.bir.model.VarKind;
import org.wso2.ballerinalang.compiler.semantics.model.types.BType;
import org.wso2.ballerinalang.compiler.util.CompilerContext;
import org.wso2.ballerinalang.compiler.util.TypeTags;
import org.wso2.ballerinalang.util.Lists;

import java.util.ArrayList;
Expand Down Expand Up @@ -475,11 +476,31 @@ public void visit(BIRNonTerminator.Move birMove) {
this.env.newInstructions.add(birMove);
return;
}
if (isIrreplaceableVar(birMove.rhsOp.variableDcl)) {
this.env.newInstructions.add(birMove);
this.env.irreplaceableTempVars.add(birMove.lhsOp.variableDcl);
return;
}
if (birMove.rhsOp.variableDcl.kind != VarKind.TEMP) {
this.env.tempVars.put(birMove.lhsOp.variableDcl, birMove.rhsOp.variableDcl);
}
}

private boolean isIrreplaceableVar(BIRVariableDcl variableDcl) {
if (variableDcl.kind != VarKind.GLOBAL) {
return false;
}
int typeTag = variableDcl.type.tag;
switch (typeTag) {
case TypeTags.BYTE:
case TypeTags.BOOLEAN:
case TypeTags.FLOAT:
return true;
default:
return TypeTags.isIntegerTypeTag(typeTag);
}
}

@Override
public void visit(BIRNonTerminator.BinaryOp birBinaryOp) {
this.optimizeNode(birBinaryOp.lhsOp, this.env);
Expand Down Expand Up @@ -741,6 +762,8 @@ public static class OptimizerEnv {
// key - temp var, value - real var
private final Map<BIRVariableDcl, BIRVariableDcl> tempVars = new HashMap<>();

private final Set<BIRVariableDcl> irreplaceableTempVars = new HashSet<>();

private List<BIRNonTerminator> newInstructions;

private final List<BIROperand> tempVarsList = new ArrayList<>();
Expand All @@ -757,7 +780,7 @@ public static class OptimizerEnv {

public void addTempBirOperand(BIROperand birOperand) {
BIRVariableDcl variableDcl = birOperand.variableDcl;
if (variableDcl.kind != VarKind.TEMP) {
if (variableDcl.kind != VarKind.TEMP || irreplaceableTempVars.contains(variableDcl)) {
return;
}
tempVarsList.add(birOperand);
Expand Down

This file was deleted.

Loading

0 comments on commit 3f153e0

Please sign in to comment.