Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 26 additions & 5 deletions Clava-JS/api/clava/code/Inliner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -381,18 +381,35 @@ export default class Inliner {
this.updateVarDecls($newNodes, newVariableMap);
this.updateVarrefs($newNodes, newVariableMap, $call);
this.updateVarrefsInTypes($newNodes, newVariableMap, $call);
this.renameLabels();
this.renameLabels($newNodes, $call.getAncestor("function") as FunctionJp);
}

/**
* Labels need to be renamed, to avoid duplicated labels.
*/
private renameLabels(): void {
private renameLabels($newNodes: Scope, $destFunction: FunctionJp): void {
// Maps label names to new LabelDecl
const newLabels: Record<string, LabelDecl> = {};

// The destination function may already contain labels generated by earlier
// inlines (e.g., from a previous Inliner instance, whose counter starts at
// zero), so generated names are checked against it instead of relying on
// the instance counter for uniqueness.
// LabelDecl join points are not traversable through Query.searchFrom, so
// existing labels are collected from the goto/label statements that
// reference them.
const destLabelNames = new Set<string>();
for (const jp of Query.searchFrom($destFunction, Joinpoint, {
self: ($jp: LaraJoinPoint) =>
$jp instanceof GotoStmt || $jp instanceof LabelStmt,
})) {
const $jp = jp as GotoStmt | LabelStmt;
const $destLabelDecl = $jp instanceof GotoStmt ? $jp.label : $jp.decl;
destLabelNames.add($destLabelDecl.name);
}

// Visit all gotoStmt and labelStmt
for (const jp of Query.search(Joinpoint, {
for (const jp of Query.searchFrom($newNodes, Joinpoint, {
Comment thread
lm-sousa marked this conversation as resolved.
self: ($jp: LaraJoinPoint) =>
$jp instanceof GotoStmt || $jp instanceof LabelStmt,
})) {
Expand All @@ -404,7 +421,11 @@ export default class Inliner {
// Get new label, or create if it does not exist yet
let $newLabelDecl: LabelDecl | undefined = newLabels[$labelDecl.name];
if ($newLabelDecl === undefined) {
const newLabelName = this.createNewLabelName($labelDecl.name);
let newLabelName = this.createNewLabelName($labelDecl.name);
while (destLabelNames.has(newLabelName)) {
newLabelName = this.createNewLabelName(newLabelName);
}
destLabelNames.add(newLabelName);
$newLabelDecl = ClavaJoinPoints.labelDecl(newLabelName);
newLabels[$labelDecl.name] = $newLabelDecl;
}
Expand All @@ -417,7 +438,7 @@ export default class Inliner {
}

// If there are any label decls, rename them
for (const $labelDecl of Query.search(LabelDecl)) {
for (const $labelDecl of Query.searchFrom($newNodes, LabelDecl)) {
const $newLabelDecl = newLabels[$labelDecl.name];
$labelDecl.replaceWith($newLabelDecl);
}
Expand Down
12 changes: 12 additions & 0 deletions ClavaWeaver/resources/clava/test/api/InlinerTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,18 @@ new Inliner().inlineFunctionTree(

console.log(Query.search("function", "callsFunctionWithLabels").first().code);

// Fresh Inliner instance per call site: label numbering must not collide with
// labels already inserted by previous instances in the same function.
const $freshCaller = Query.search("function", "callsFunctionWithLabelsFresh")
.first();

for (const $call of [...Query.searchFrom($freshCaller, "call")]) {
const inliner = new Inliner();
inliner.inline($call.getAncestor("exprStmt"));
}

console.log($freshCaller.code);

//console.log(Query.search("function", "functionWithStatic").first().ast);

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,11 +365,11 @@ int inlineTest2() {
__inline_0_decomp_8 = __inline_0_i == 0;
if(__inline_0_decomp_8) {
__inline_0___return_value = 1;
goto inliner_3___return_label;
goto inliner_0___return_label;
}
__inline_0___return_value = 2;
goto inliner_3___return_label;
inliner_3___return_label:
goto inliner_0___return_label;
inliner_0___return_label:
b = __inline_0___return_value;
}
}
Expand All @@ -383,11 +383,11 @@ int inlineTest2() {
__inline_1_decomp_8 = __inline_1_i == 0;
if(__inline_1_decomp_8) {
__inline_1___return_value = 1;
goto inliner_0___return_label;
goto inliner_1___return_label;
}
__inline_1___return_value = 2;
goto inliner_0___return_label;
inliner_0___return_label:
goto inliner_1___return_label;
inliner_1___return_label:
b = __inline_1___return_value;
}
}
Expand Down Expand Up @@ -429,11 +429,11 @@ void functionThatCallsFunctionWithReturnButsDoesNotUseResult() {
int __inline_0___return_value;
if(__inline_0_a) {
__inline_0___return_value = 1;
goto __return_label;
goto inliner_0___return_label;
}
__inline_0___return_value = 0;
goto __return_label;
__return_label:
goto inliner_0___return_label;
inliner_0___return_label:
;
}
}
Expand Down Expand Up @@ -541,21 +541,46 @@ int callsFunctionWithLabels() {
{
int __inline_0_a;
__inline_0_a = 0;
goto inliner_11_a_label;
goto inliner_0_a_label;
__inline_0_a = __inline_0_a + 20;
inliner_11_a_label:
inliner_0_a_label:
__inline_0_a = __inline_0_a + 10;
a = __inline_0_a;
}
{
int __inline_1_a;
__inline_1_a = 0;
goto inliner_5_a_label;
goto inliner_1_a_label;
__inline_1_a = __inline_1_a + 20;
inliner_5_a_label:
inliner_1_a_label:
__inline_1_a = __inline_1_a + 10;
a = __inline_1_a;
}

return a;
}

void callsFunctionWithLabelsFresh() {
int a;
a = 0;
{
int __inline_0_a;
__inline_0_a = 0;
goto inliner_0_a_label;
__inline_0_a = __inline_0_a + 20;
inliner_0_a_label:
__inline_0_a = __inline_0_a + 10;
a = __inline_0_a;
}
{
int __inline_0_a;
__inline_0_a = 0;
goto inliner_1_a_label;
__inline_0_a = __inline_0_a + 20;
inliner_1_a_label:
__inline_0_a = __inline_0_a + 10;
a = __inline_0_a;
}
}


51 changes: 38 additions & 13 deletions ClavaWeaver/resources/clava/test/api/c/results/InlinerTest.js.txt
Original file line number Diff line number Diff line change
Expand Up @@ -365,11 +365,11 @@ int inlineTest2() {
__inline_0_decomp_8 = __inline_0_i == 0;
if(__inline_0_decomp_8) {
__inline_0___return_value = 1;
goto inliner_3___return_label;
goto inliner_0___return_label;
}
__inline_0___return_value = 2;
goto inliner_3___return_label;
inliner_3___return_label:
goto inliner_0___return_label;
inliner_0___return_label:
b = __inline_0___return_value;
}
}
Expand All @@ -383,11 +383,11 @@ int inlineTest2() {
__inline_1_decomp_8 = __inline_1_i == 0;
if(__inline_1_decomp_8) {
__inline_1___return_value = 1;
goto inliner_0___return_label;
goto inliner_1___return_label;
}
__inline_1___return_value = 2;
goto inliner_0___return_label;
inliner_0___return_label:
goto inliner_1___return_label;
inliner_1___return_label:
b = __inline_1___return_value;
}
}
Expand Down Expand Up @@ -429,11 +429,11 @@ void functionThatCallsFunctionWithReturnButsDoesNotUseResult() {
int __inline_0___return_value;
if(__inline_0_a) {
__inline_0___return_value = 1;
goto __return_label;
goto inliner_0___return_label;
}
__inline_0___return_value = 0;
goto __return_label;
__return_label:
goto inliner_0___return_label;
inliner_0___return_label:
;
}
}
Expand Down Expand Up @@ -541,21 +541,46 @@ int callsFunctionWithLabels() {
{
int __inline_0_a;
__inline_0_a = 0;
goto inliner_11_a_label;
goto inliner_0_a_label;
__inline_0_a = __inline_0_a + 20;
inliner_11_a_label:
inliner_0_a_label:
__inline_0_a = __inline_0_a + 10;
a = __inline_0_a;
}
{
int __inline_1_a;
__inline_1_a = 0;
goto inliner_5_a_label;
goto inliner_1_a_label;
__inline_1_a = __inline_1_a + 20;
inliner_5_a_label:
inliner_1_a_label:
__inline_1_a = __inline_1_a + 10;
a = __inline_1_a;
}

return a;
}

void callsFunctionWithLabelsFresh() {
int a;
a = 0;
{
int __inline_0_a;
__inline_0_a = 0;
goto inliner_0_a_label;
__inline_0_a = __inline_0_a + 20;
inliner_0_a_label:
__inline_0_a = __inline_0_a + 10;
a = __inline_0_a;
}
{
int __inline_0_a;
__inline_0_a = 0;
goto inliner_1_a_label;
__inline_0_a = __inline_0_a + 20;
inliner_1_a_label:
__inline_0_a = __inline_0_a + 10;
a = __inline_0_a;
}
}


7 changes: 7 additions & 0 deletions ClavaWeaver/resources/clava/test/api/c/src/inliner.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,4 +238,11 @@ int callsFunctionWithLabels() {
a = functionWithLabel();

return a;
}

void callsFunctionWithLabelsFresh() {
int a = 0;

a = functionWithLabel();
a = functionWithLabel();
}
Loading