diff --git a/README.md b/README.md
index 40bbb9bc..7ed93b2b 100644
--- a/README.md
+++ b/README.md
@@ -127,12 +127,12 @@ bazelisk test //maldoca/js/ir/conversion/...
### Run the `jsir_gen` tool
-Convert a JavaScript source file to JSHIR:
+Convert a JavaScript source file to JSIR:
```shell
bazelisk run //maldoca/js/ir:jsir_gen --\
--input_file=$(pwd)/maldoca/js/ir/conversion/tests/if_statement/input.js \
- --passes=source2ast,ast2hir
+ --passes=source2ast,ast2jsir
```
## Other links
diff --git a/docs/dataflow_analysis.md b/docs/dataflow_analysis.md
index bccd7c5e..983e491c 100644
--- a/docs/dataflow_analysis.md
+++ b/docs/dataflow_analysis.md
@@ -264,7 +264,7 @@ The JSIR for the code above is as follows:
```
...
%cond = jsir.identifier{"cond"}
-jshir.if_statement (%cond) ({
+jsir.if_statement (%cond) ({
%a_ref_true = jsir.identifier_ref{"a"}
%1 = jsir.numeric_literal{1}
%assign_true = jsir.assignment_expression (%a_ref_true, %1)
@@ -288,14 +288,14 @@ preserves the nested structures. We can see that the two branches of the
> more than 1 block in any region.
The JSIR dataflow analysis API understands the branching behaviors of
-`jshir.if_statement`, and builds **CFG (control flow graph) edges** to represent
+`jsir.if_statement`, and builds **CFG (control flow graph) edges** to represent
them internally:
```
...
%cond = jsir.identifier{"cond"}
┌─────◄
-│ jshir.if_statement (%cond) ({
+│ jsir.if_statement (%cond) ({
├───────►
│ %a_ref_true = jsir.identifier_ref{"a"}
│ %1 = jsir.numeric_literal{1}
@@ -334,7 +334,7 @@ reaching `B1`, i.e. right **B**efore the `if`-statement.
// state[%cond] = Unknown
// state[B1] = {}
┌─────◄
-│ jshir.if_statement (%cond) ({
+│ jsir.if_statement (%cond) ({
├───────►
│ <IR for `a = 1;`>
│ ┌────◄
@@ -359,7 +359,7 @@ to two program points: `T0` and `F0`, which represent the entry points of the
// state[%cond] = Unknown
// state[B1] = {}
┌─────◄
-│ jshir.if_statement (%cond) ({
+│ jsir.if_statement (%cond) ({
├───────►
│ // state[T0] = {}
│ <IR for `a = 1;`>
@@ -412,7 +412,7 @@ propagation before, we will consequently visit all ops in the region.
// state[%cond] = Unknown
// state[B1] = {}
┌─────◄
-│ jshir.if_statement (%cond) ({
+│ jsir.if_statement (%cond) ({
├───────►
│ // state[T0] = {}
│ %a_ref_true = jsir.identifier_ref{"a"}
@@ -452,7 +452,7 @@ the CFG edge and propagate its state to `E0`, i.e. the end of the
// state[%cond] = Unknown
// state[B1] = {}
┌─────◄
-│ jshir.if_statement (%cond) ({
+│ jsir.if_statement (%cond) ({
├───────►
│ // state[T0] = {}
│ <IR for `a = 1;`>
@@ -485,7 +485,7 @@ compute states up to `state[F4]`:
// state[%cond] = Unknown
// state[B1] = {}
┌─────◄
-│ jshir.if_statement (%cond) ({
+│ jsir.if_statement (%cond) ({
├───────►
│ // state[T0] = {}
│ <IR for `a = 1;`>
@@ -526,7 +526,7 @@ propagate its state to `E0`.
// state[%cond] = Unknown
// state[B1] = {}
┌─────◄
-│ jshir.if_statement (%cond) ({
+│ jsir.if_statement (%cond) ({
├───────►
│ // state[T0] = {}
│ <IR for `a = 1;`>
@@ -604,7 +604,7 @@ The final result of the analysis, in full detail, is as follows:
// state[%cond] = Unknown
// state[B1] = [default = Unknown] {}
┌─────◄
-│ jshir.if_statement (%cond) ({
+│ jsir.if_statement (%cond) ({
├───────►
│ // state[T0] = [default = Unknown] {}
│ %a_ref_true = jsir.identifier_ref{"a"}
@@ -684,7 +684,7 @@ the combination of all iterations.
Now, similar to the previous examples, we convert the code into JSIR:
```
-jshir.while_statement ({
+jsir.while_statement ({
// The `test` region
// IR for `cond()`:
%cond_id = jsir.identifier {"cond"}
@@ -711,7 +711,7 @@ Then, we build CFG edges to represent control flow branches:
%assign_before = jsir.assignment_expression (%a_ref_before, %1)
jsir.expression_statement (%assign_before)
┌─────◄
-│ jshir.while_statement ({
+│ jsir.while_statement ({
├───────►
│ // IR for `cond()`:
│ %cond = ...
@@ -739,7 +739,7 @@ Similar to the handling of the `if`-statement, we compute the states before the
<IR for `a = 1;`>
// state[B4] = {a: Const{1}}
┌─────◄
-│ jshir.while_statement ({
+│ jsir.while_statement ({
├───────►
│ // state[T0] = {a: Const{1}}
│ // IR for `cond()`:
@@ -773,7 +773,7 @@ don't know the return value of `cond()`, so we can only assign `Unknown` to
<IR for `a = 1;`>
// state[B4] = {a: Const{1}}
┌─────◄
-│ jshir.while_statement ({
+│ jsir.while_statement ({
├───────►
│ // state[T0] = {a: Const{1}}
│ // IR for `cond()`:
@@ -804,7 +804,7 @@ possible to enter the loop body and exit the loop. Therefore, we propagate
<IR for `a = 1;`>
// state[B4] = {a: Const{1}}
┌─────◄
-│ jshir.while_statement ({
+│ jsir.while_statement ({
├───────►
│ // state[T0] = {a: Const{1}}
│ %cond = <IR for `cond()`>
@@ -840,7 +840,7 @@ first iteration of the loop body, which changes `a` from `1` to `3`.
<IR for `a = 1;`>
// state[B4] = {a: Const{1}}
┌─────◄
-│ jshir.while_statement ({
+│ jsir.while_statement ({
├───────►
│ // state[T0] = {a: Const{1}}
│ %cond = <IR for `cond()`>
@@ -867,7 +867,7 @@ At the end of the loop body, we jump back to the `test` region, which `Join`s
<IR for `a = 1;`>
// state[B4] = {a: Const{1}}
┌─────◄
-│ jshir.while_statement ({
+│ jsir.while_statement ({
├───────►
│ // state[T0] = {a: Const{1} Unknown}
│ %cond = <IR for `cond()`>
@@ -896,7 +896,7 @@ again with this new state, and propagate it to `I0` and `E0`.
<IR for `a = 1;`>
// state[B4] = {a: Const{1}}
┌─────◄
-│ jshir.while_statement ({
+│ jsir.while_statement ({
├───────►
│ // state[T0] = {a: Unknown}
│ %cond = <IR for `cond()`>
@@ -929,7 +929,7 @@ end of the `body` region `I6` becomes `{a: Unknown}`.
<IR for `a = 1;`>
// state[B4] = {a: Const{1}}
┌─────◄
-│ jshir.while_statement ({
+│ jsir.while_statement ({
├───────►
│ // state[T0] = {a: Unknown}
│ // IR for `cond()`:
diff --git a/docs/intermediate_representation_design.md b/docs/intermediate_representation_design.md
index d207cd93..d853d2ea 100644
--- a/docs/intermediate_representation_design.md
+++ b/docs/intermediate_representation_design.md
@@ -211,10 +211,10 @@ semantic meanings:
## Representing control flows
-As mentioned above, JSIR seeks to have a nearly one-to-one mapping from the
-AST. Therefore, to preserve all information about the original control flow
+As mentioned above, JSIR seeks to have a nearly one-to-one mapping from the AST.
+Therefore, to preserve all information about the original control flow
structures, we define a separate op for each control flow structure (e.g.
-`jshir.if_statement`, `jshir.while_statement`, etc.). The nested code blocks are
+`jsir.if_statement`, `jsir.while_statement`, etc.). The nested code blocks are
represented as MLIR [regions](https://mlir.llvm.org/docs/LangRef/#regions).
### Example: `if`-statement
@@ -247,7 +247,7 @@ And, its corresponding JSIR is as follows:
```mlir
%cond = jsir.identifier {"cond"}
-jshir.if_statement (%cond) ({
+jsir.if_statement (%cond) ({
%a = jsir.identifier {"a"}
jsir.expression_statement (%a)
}, {
@@ -289,7 +289,7 @@ WhileStatement {
Its corresponding JSIR is as follows:
```mlir
-jshir.while_statement ({
+jsir.while_statement ({
%cond_id = jsir.identifier {"cond"}
%cond_call = jsir.call_expression (%cond_id)
jsir.expr_region_end (%cond_call)
@@ -300,11 +300,11 @@ jshir.while_statement ({
})
```
-Note that unlike `jshir.if_statement`, the condition in a
-`jshir.while_statement` is represented as a region rather than a normal SSA
-value (`%cond`). This is because the condition is evaluated in each iteration
-**within** the `while`-statement, whereas the condition is evaluated only once
-**before** the `if`-statement.
+Note that unlike `jsir.if_statement`, the condition in a `jsir.while_statement`
+is represented as a region rather than a normal SSA value (`%cond`). This is
+because the condition is evaluated in each iteration **within** the
+`while`-statement, whereas the condition is evaluated only once **before** the
+`if`-statement.
### Example: logical expression
@@ -333,7 +333,7 @@ Its corresponding JSIR is as follows:
```mlir
%x_ref = jsir.identifier_ref {"x"}
%a = jsir.identifier {"a"}
-%and = jshir.logical_expression (%a) ({
+%and = jsir.logical_expression (%a) ({
%b = jsir.identifier {"b"}
jsir.expr_region_end (%b)
})
@@ -341,7 +341,7 @@ Its corresponding JSIR is as follows:
jsir.expression_statement (%assign)
```
-Note that in `jshir.logical_expression`, `left` is an SSA value, and `right` is
-a region. This is because `left` is always evaluated first, whereas `right` is
+Note that in `jsir.logical_expression`, `left` is an SSA value, and `right` is a
+region. This is because `left` is always evaluated first, whereas `right` is
only evaluated if the result of `left` is truthy, and omitted if `left` is falsy
due to the short-circuit behavior.
diff --git a/maldoca/astgen/ast_def.cc b/maldoca/astgen/ast_def.cc
index 6debce86..0e253c1f 100644
--- a/maldoca/astgen/ast_def.cc
+++ b/maldoca/astgen/ast_def.cc
@@ -225,7 +225,7 @@ std::optional NodeDef::ir_op_name(absl::string_view lang_name,
return std::nullopt;
}
- auto ir_name = absl::StrCat(lang_name, has_control_flow() ? "hir" : "ir");
+ auto ir_name = absl::StrCat(lang_name, "ir");
Symbol result{ir_name};
diff --git a/maldoca/astgen/ast_def.h b/maldoca/astgen/ast_def.h
index c8be0376..c5d02ca0 100644
--- a/maldoca/astgen/ast_def.h
+++ b/maldoca/astgen/ast_def.h
@@ -218,22 +218,15 @@ class NodeDef {
return aggregated_kinds_;
}
- // Whether this node has control-flow-related information.
- //
- // A node is considered to have control-flow-related information if it
- // contains some branch semantics.
- //
- // Example: IfStatement, BreakStatement.
- //
- // When this is true, we define two ops, one in HIR (high-level IR), one in
- // LIR (low-level IR).
- bool has_control_flow() const { return has_control_flow_; }
+ // Deprecated: No longer used for dialect splitting. Merged HIR into IR.
+ [[deprecated("Merged HIR into IR")]]
+ bool has_control_flow() const {
+ return has_control_flow_;
+ }
// The MLIR op name (C++ class name).
//
- // :
- // has_control_flow: hir
- // !has_control_flow: ir
+ // : ir
//
// - Non-leaf type: "OpInterface"
// - Leaf type:
diff --git a/maldoca/astgen/ast_def.proto b/maldoca/astgen/ast_def.proto
index c6071136..5c42041d 100644
--- a/maldoca/astgen/ast_def.proto
+++ b/maldoca/astgen/ast_def.proto
@@ -295,9 +295,8 @@ message NodeDefPb {
// Supported kinds. Each kind leads to a different IR op.
repeated FieldKind kinds = 6;
- // Whether this op has control flow. If so, we will define a high-level IR op,
- // and a low-level IR op.
- optional bool has_control_flow = 7;
+ // Deprecated: No longer used for dialect splitting. Merged HIR into IR.
+ optional bool has_control_flow = 7 [deprecated = true];
// [Optional] Custom MLIR op name.
//
diff --git a/maldoca/astgen/ir_table_gen_printer.cc b/maldoca/astgen/ir_table_gen_printer.cc
index 031ecddf..2244ea1e 100644
--- a/maldoca/astgen/ir_table_gen_printer.cc
+++ b/maldoca/astgen/ir_table_gen_printer.cc
@@ -204,8 +204,6 @@ void IrTableGenPrinter::PrintAst(const AstDef& ast, absl::string_view ir_path) {
void IrTableGenPrinter::PrintNode(const AstDef& ast, const NodeDef& node,
FieldKind kind) {
auto ir_name = absl::StrCat(ast.lang_name(), "ir");
- auto hir_name =
- absl::StrCat(ast.lang_name(), node.has_control_flow() ? "hir" : "ir");
auto vars = WithVars({
{"OpName", node.ir_op_name(ast.lang_name(), kind).value().ToPascalCase()},
@@ -213,7 +211,6 @@ void IrTableGenPrinter::PrintNode(const AstDef& ast, const NodeDef& node,
{"Name", node.name()},
{"name", Symbol(node.name()).ToCcVarName()},
{"IrName", Symbol(ir_name).ToPascalCase()},
- {"HirName", Symbol(hir_name).ToPascalCase()},
});
std::vector traits;
@@ -295,7 +292,7 @@ void IrTableGenPrinter::PrintNode(const AstDef& ast, const NodeDef& node,
// ]> {
// ```
Print(
- "def $OpName$ : $HirName$_Op<\n"
+ "def $OpName$ : $IrName$_Op<\n"
" \"$op_mnemonic$\", [\n");
{
diff --git a/maldoca/js/driver/conversion.cc b/maldoca/js/driver/conversion.cc
index 26ebcd48..07437206 100644
--- a/maldoca/js/driver/conversion.cc
+++ b/maldoca/js/driver/conversion.cc
@@ -69,12 +69,11 @@ absl::StatusOr ToJsAstRepr::FromJsAstStringRepr(
// AST -> HIR
// -----------------------------------------------------------------------------
-absl::StatusOr ToJsHirRepr::FromJsAstRepr(
- const JsAstRepr &ast_repr,
- mlir::MLIRContext &mlir_context) {
+absl::StatusOr ToJsirRepr::FromJsAstRepr(
+ const JsAstRepr& ast_repr, mlir::MLIRContext& mlir_context) {
ABSL_ASSIGN_OR_RETURN(mlir::OwningOpRef op,
- AstToJshirFile(*ast_repr.ast, mlir_context));
- return JsHirRepr{std::move(op), ast_repr.scopes, ast_repr.source_map};
+ AstToJsirFile(*ast_repr.ast, mlir_context));
+ return JsirRepr{std::move(op), ast_repr.scopes, ast_repr.source_map};
}
// -----------------------------------------------------------------------------
@@ -96,29 +95,28 @@ absl::StatusOr ToJsAstRepr::FromJsSourceRepr(
// Source -> AST string -> AST -> HIR
// -----------------------------------------------------------------------------
-absl::StatusOr ToJsHirRepr::FromJsSourceRepr(
- const JsSourceRepr &source_repr, BabelParseRequest parse_request,
+absl::StatusOr ToJsirRepr::FromJsSourceRepr(
+ const JsSourceRepr& source_repr, BabelParseRequest parse_request,
absl::Duration timeout, std::optional recursion_depth_limit,
- Babel &babel, mlir::MLIRContext &mlir_context) {
+ Babel& babel, mlir::MLIRContext& mlir_context) {
ABSL_ASSIGN_OR_RETURN(
JsAstRepr ast,
ToJsAstRepr::FromJsSourceRepr(source_repr, parse_request, timeout,
recursion_depth_limit, babel));
- return ToJsHirRepr::FromJsAstRepr(ast, mlir_context);
+ return ToJsirRepr::FromJsAstRepr(ast, mlir_context);
}
// -----------------------------------------------------------------------------
// AST string -> AST -> HIR
// -----------------------------------------------------------------------------
-absl::StatusOr ToJsHirRepr::FromJsAstStringRepr(
- const JsAstStringRepr &ast_string_repr,
- std::optional recursion_depth_limit,
- mlir::MLIRContext &mlir_context) {
+absl::StatusOr ToJsirRepr::FromJsAstStringRepr(
+ const JsAstStringRepr& ast_string_repr,
+ std::optional recursion_depth_limit, mlir::MLIRContext& mlir_context) {
ABSL_ASSIGN_OR_RETURN(
JsAstRepr ast,
ToJsAstRepr::FromJsAstStringRepr(ast_string_repr, recursion_depth_limit));
- return ToJsHirRepr::FromJsAstRepr(ast, mlir_context);
+ return ToJsirRepr::FromJsAstRepr(ast, mlir_context);
}
// =============================================================================
@@ -129,11 +127,10 @@ absl::StatusOr ToJsHirRepr::FromJsAstStringRepr(
// HIR -> AST
// -----------------------------------------------------------------------------
-absl::StatusOr ToJsAstRepr::FromJsHirRepr(
- const JsHirRepr &hir_repr) {
+absl::StatusOr ToJsAstRepr::FromJsirRepr(const JsirRepr& ir_repr) {
ABSL_ASSIGN_OR_RETURN(std::unique_ptr ast,
- JshirFileToAst(hir_repr.op.get()));
- return JsAstRepr{std::move(ast), hir_repr.scopes, hir_repr.source_map};
+ JsirFileToAst(ir_repr.op.get()));
+ return JsAstRepr{std::move(ast), ir_repr.scopes, ir_repr.source_map};
}
// -----------------------------------------------------------------------------
@@ -166,9 +163,9 @@ absl::StatusOr ToJsSourceRepr::FromJsAstStringRepr(
// HIR -> AST -> AST string
// -----------------------------------------------------------------------------
-absl::StatusOr ToJsAstStringRepr::FromJsHirRepr(
- const JsHirRepr &hir_repr) {
- ABSL_ASSIGN_OR_RETURN(JsAstRepr ast, ToJsAstRepr::FromJsHirRepr(hir_repr));
+absl::StatusOr ToJsAstStringRepr::FromJsirRepr(
+ const JsirRepr& ir_repr) {
+ ABSL_ASSIGN_OR_RETURN(JsAstRepr ast, ToJsAstRepr::FromJsirRepr(ir_repr));
return ToJsAstStringRepr::FromJsAstRepr(ast);
}
@@ -176,11 +173,11 @@ absl::StatusOr ToJsAstStringRepr::FromJsHirRepr(
// HIR -> AST -> AST string -> Source
// -----------------------------------------------------------------------------
-absl::StatusOr ToJsSourceRepr::FromJsHirRepr(
- const JsHirRepr &hir_repr, BabelGenerateOptions generate_options,
- absl::Duration timeout, Babel &babel) {
+absl::StatusOr ToJsSourceRepr::FromJsirRepr(
+ const JsirRepr& ir_repr, BabelGenerateOptions generate_options,
+ absl::Duration timeout, Babel& babel) {
ABSL_ASSIGN_OR_RETURN(JsAstStringRepr ast_string,
- ToJsAstStringRepr::FromJsHirRepr(hir_repr));
+ ToJsAstStringRepr::FromJsirRepr(ir_repr));
return ToJsSourceRepr::FromJsAstStringRepr(ast_string,
generate_options, timeout, babel);
}
diff --git a/maldoca/js/driver/conversion.h b/maldoca/js/driver/conversion.h
index b1301212..6882d2e7 100644
--- a/maldoca/js/driver/conversion.h
+++ b/maldoca/js/driver/conversion.h
@@ -48,9 +48,9 @@ struct ToJsSourceRepr {
const JsAstRepr &ast_repr, BabelGenerateOptions generate_options,
absl::Duration timeout, Babel &babel);
- static absl::StatusOr FromJsHirRepr(
- const JsHirRepr &hir_repr, BabelGenerateOptions generate_options,
- absl::Duration timeout, Babel &babel);
+ static absl::StatusOr FromJsirRepr(
+ const JsirRepr& ir_repr, BabelGenerateOptions generate_options,
+ absl::Duration timeout, Babel& babel);
};
struct ToJsAstStringRepr {
@@ -61,8 +61,7 @@ struct ToJsAstStringRepr {
static absl::StatusOr FromJsAstRepr(
const JsAstRepr &ast_repr);
- static absl::StatusOr FromJsHirRepr(
- const JsHirRepr &hir_repr);
+ static absl::StatusOr FromJsirRepr(const JsirRepr& ir_repr);
};
struct ToJsAstRepr {
@@ -75,23 +74,22 @@ struct ToJsAstRepr {
const JsAstStringRepr &ast_string_repr,
std::optional recursion_depth_limit);
- static absl::StatusOr FromJsHirRepr(const JsHirRepr &hir_repr);
+ static absl::StatusOr FromJsirRepr(const JsirRepr& ir_repr);
};
-struct ToJsHirRepr {
- static absl::StatusOr FromJsSourceRepr(
- const JsSourceRepr &source_repr, BabelParseRequest parse_request,
+struct ToJsirRepr {
+ static absl::StatusOr FromJsSourceRepr(
+ const JsSourceRepr& source_repr, BabelParseRequest parse_request,
absl::Duration timeout, std::optional recursion_depth_limit,
- Babel &babel, mlir::MLIRContext &mlir_context);
+ Babel& babel, mlir::MLIRContext& mlir_context);
- static absl::StatusOr FromJsAstStringRepr(
- const JsAstStringRepr &ast_string_repr,
+ static absl::StatusOr FromJsAstStringRepr(
+ const JsAstStringRepr& ast_string_repr,
std::optional recursion_depth_limit,
- mlir::MLIRContext &mlir_context);
+ mlir::MLIRContext& mlir_context);
- static absl::StatusOr FromJsAstRepr(
- const JsAstRepr &ast_repr,
- mlir::MLIRContext &mlir_context);
+ static absl::StatusOr FromJsAstRepr(
+ const JsAstRepr& ast_repr, mlir::MLIRContext& mlir_context);
};
} // namespace maldoca
diff --git a/maldoca/js/driver/conversion_test.cc b/maldoca/js/driver/conversion_test.cc
index ff303a75..14426725 100644
--- a/maldoca/js/driver/conversion_test.cc
+++ b/maldoca/js/driver/conversion_test.cc
@@ -64,7 +64,7 @@ struct TestCase {
// Note: `hir_repr` is not constructed by parsing the golden file. Instead, it
// is constructed by converting the `ast` above. This is because the golden
// file does not contain loc information.
- JsHirRepr hir_repr;
+ JsirRepr hir_repr;
std::string hir_dump;
BabelAstString lifted_babel_ast_string;
@@ -120,8 +120,8 @@ absl::StatusOr GetTestCase() {
auto mlir_context = std::make_unique();
LoadNecessaryDialects(*mlir_context);
- ABSL_ASSIGN_OR_RETURN(JsHirRepr hir_repr,
- ToJsHirRepr::FromJsAstRepr(ast_repr, *mlir_context));
+ ABSL_ASSIGN_OR_RETURN(JsirRepr hir_repr,
+ ToJsirRepr::FromJsAstRepr(ast_repr, *mlir_context));
ABSL_ASSIGN_OR_RETURN(auto hir_str, load_content("test_hir.mlir.test"));
BabelAstString lifted_babel_ast_string;
@@ -184,14 +184,14 @@ TEST(ConversionTest, AstStringToAst) {
CheckAst(repr, test_case);
}
-TEST(ConversionTest, AstToHir) {
+TEST(ConversionTest, AstToJsir) {
MALDOCA_ASSERT_OK_AND_ASSIGN(TestCase test_case, GetTestCase());
mlir::MLIRContext mlir_context;
LoadNecessaryDialects(mlir_context);
MALDOCA_ASSERT_OK_AND_ASSIGN(
- JsHirRepr repr, ToJsHirRepr::FromJsAstRepr(test_case.ast, mlir_context));
+ JsirRepr repr, ToJsirRepr::FromJsAstRepr(test_case.ast, mlir_context));
EXPECT_EQ(mlir::debugString(*repr.op), test_case.hir_dump);
EXPECT_THAT(repr.scopes, EqualsProto(test_case.scopes));
@@ -215,7 +215,7 @@ TEST(ConversionTest, SourceToAst) {
CheckAst(repr, test_case);
}
-TEST(ConversionTest, SourceToHir) {
+TEST(ConversionTest, SourceToJsir) {
MALDOCA_ASSERT_OK_AND_ASSIGN(TestCase test_case, GetTestCase());
QuickJsBabel babel;
@@ -228,8 +228,8 @@ TEST(ConversionTest, SourceToHir) {
LoadNecessaryDialects(mlir_context);
MALDOCA_ASSERT_OK_AND_ASSIGN(
- JsHirRepr repr,
- ToJsHirRepr::FromJsSourceRepr(
+ JsirRepr repr,
+ ToJsirRepr::FromJsSourceRepr(
source_repr, parse_request, absl::InfiniteDuration(),
/*recursion_depth_limit=*/std::nullopt, babel, mlir_context));
@@ -237,7 +237,7 @@ TEST(ConversionTest, SourceToHir) {
EXPECT_THAT(repr.scopes, EqualsProto(test_case.scopes));
}
-TEST(ConversionTest, AstStringToHir) {
+TEST(ConversionTest, AstStringToJsir) {
MALDOCA_ASSERT_OK_AND_ASSIGN(TestCase test_case, GetTestCase());
JsAstStringRepr ast_string_repr{test_case.parsed_babel_ast_string,
@@ -247,10 +247,9 @@ TEST(ConversionTest, AstStringToHir) {
LoadNecessaryDialects(mlir_context);
MALDOCA_ASSERT_OK_AND_ASSIGN(
- JsHirRepr repr,
- ToJsHirRepr::FromJsAstStringRepr(ast_string_repr,
- /*recursion_depth_limit=*/std::nullopt,
- mlir_context));
+ JsirRepr repr, ToJsirRepr::FromJsAstStringRepr(
+ ast_string_repr,
+ /*recursion_depth_limit=*/std::nullopt, mlir_context));
EXPECT_EQ(mlir::debugString(*repr.op), test_case.hir_dump);
EXPECT_THAT(repr.scopes, EqualsProto(test_case.scopes));
@@ -260,11 +259,11 @@ TEST(ConversionTest, AstStringToHir) {
// Lifting conversions
// =============================================================================
-TEST(ConversionTest, HirToAst) {
+TEST(ConversionTest, JsirToAst) {
MALDOCA_ASSERT_OK_AND_ASSIGN(TestCase test_case, GetTestCase());
MALDOCA_ASSERT_OK_AND_ASSIGN(JsAstRepr repr,
- ToJsAstRepr::FromJsHirRepr(test_case.hir_repr));
+ ToJsAstRepr::FromJsirRepr(test_case.hir_repr));
CheckAst(repr, test_case);
}
@@ -298,25 +297,25 @@ TEST(ConversionTest, AstStringToSource) {
EXPECT_EQ(repr.source, test_case.source);
}
-TEST(ConversionTest, HirToAstString) {
+TEST(ConversionTest, JsirToAstString) {
MALDOCA_ASSERT_OK_AND_ASSIGN(TestCase test_case, GetTestCase());
MALDOCA_ASSERT_OK_AND_ASSIGN(
JsAstStringRepr repr,
- ToJsAstStringRepr::FromJsHirRepr(test_case.hir_repr));
+ ToJsAstStringRepr::FromJsirRepr(test_case.hir_repr));
EXPECT_THAT(repr.ast_string, EqualsProto(test_case.lifted_babel_ast_string));
}
-TEST(ConversionTest, HirToSource) {
+TEST(ConversionTest, JsirToSource) {
MALDOCA_ASSERT_OK_AND_ASSIGN(TestCase test_case, GetTestCase());
QuickJsBabel babel;
MALDOCA_ASSERT_OK_AND_ASSIGN(
JsSourceRepr repr,
- ToJsSourceRepr::FromJsHirRepr(test_case.hir_repr, BabelGenerateOptions(),
- absl::InfiniteDuration(), babel));
+ ToJsSourceRepr::FromJsirRepr(test_case.hir_repr, BabelGenerateOptions(),
+ absl::InfiniteDuration(), babel));
EXPECT_EQ(repr.source, test_case.source);
}
diff --git a/maldoca/js/driver/driver.cc b/maldoca/js/driver/driver.cc
index 42e92cf7..bb7b0709 100644
--- a/maldoca/js/driver/driver.cc
+++ b/maldoca/js/driver/driver.cc
@@ -51,8 +51,8 @@ std::ostream &operator<<(std::ostream &os, JsReprKind kind) {
return os << "AstString";
case JsReprKind::kAst:
return os << "Ast";
- case JsReprKind::kJshir:
- return os << "Jshir";
+ case JsReprKind::kJsir:
+ return os << "Jsir";
}
}
@@ -72,7 +72,7 @@ absl::StatusOr> JsRepr::FromProto(
case JsReprPb::kBabelAstString:
return std::make_unique(proto.babel_ast_string(),
std::move(source_map));
- case JsReprPb::kJsHir:
+ case JsReprPb::kJsIr:
return absl::UnimplementedError("JSIR parsing not supported");
}
}
@@ -95,9 +95,9 @@ absl::StatusOr JsAstStringRepr::ToProto() const {
return proto;
}
-absl::StatusOr JsHirRepr::ToProto() const {
+absl::StatusOr JsirRepr::ToProto() const {
JsReprPb proto;
- proto.set_js_hir(mlir::debugString(*op));
+ proto.set_js_ir(mlir::debugString(*op));
if (source_map.has_value()) {
proto.set_source_map(*source_map);
}
diff --git a/maldoca/js/driver/driver.h b/maldoca/js/driver/driver.h
index c405a1ce..7e2ec25a 100644
--- a/maldoca/js/driver/driver.h
+++ b/maldoca/js/driver/driver.h
@@ -59,7 +59,7 @@ enum class JsReprKind {
kJsSource,
kAstString,
kAst,
- kJshir,
+ kJsir,
};
std::ostream& operator<<(std::ostream& os, JsReprKind kind);
@@ -178,28 +178,17 @@ struct JsirRepr : JsRepr {
mlir::OwningOpRef op;
BabelScopes scopes;
- static bool classof(const JsRepr* repr) {
- return repr->kind == JsReprKind::kJshir;
- }
-
std::string Dump() const override { return mlir::debugString(*op); }
- protected:
- JsirRepr(JsReprKind kind, mlir::OwningOpRef op,
- BabelScopes scopes, std::optional source_map)
- : JsRepr(kind, std::move(source_map)),
+ public:
+ JsirRepr(mlir::OwningOpRef op, BabelScopes scopes,
+ std::optional source_map)
+ : JsRepr(JsReprKind::kJsir, std::move(source_map)),
op(std::move(op)),
scopes(std::move(scopes)) {}
-};
-
-struct JsHirRepr : JsirRepr {
- JsHirRepr(mlir::OwningOpRef op, BabelScopes scopes,
- std::optional source_map)
- : JsirRepr(JsReprKind::kJshir, std::move(op), std::move(scopes),
- std::move(source_map)) {}
static bool classof(const JsRepr* repr) {
- return repr->kind == JsReprKind::kJshir;
+ return repr->kind == JsReprKind::kJsir;
}
absl::StatusOr ToProto() const override;
diff --git a/maldoca/js/driver/driver.proto b/maldoca/js/driver/driver.proto
index 6e24ddda..e6bd2fc8 100644
--- a/maldoca/js/driver/driver.proto
+++ b/maldoca/js/driver/driver.proto
@@ -31,7 +31,7 @@ message JsReprPb {
oneof kind {
string js_source = 1;
BabelAstString babel_ast_string = 2;
- string js_hir = 3;
+ string js_ir = 3;
}
optional string source_map = 7;
@@ -52,8 +52,8 @@ message JsConversionConfig {
JsAstToAstStringConfig js_ast_to_ast_string = 4;
// ast <=> hir
- JsAstToHirConfig js_ast_to_hir = 5;
- JsHirToAstConfig js_hir_to_ast = 6;
+ JsAstToJsirConfig js_ast_to_jsir = 5;
+ JsirToAstConfig jsir_to_ast = 6;
}
}
@@ -73,9 +73,9 @@ message JsAstStringToAstConfig {
message JsAstToAstStringConfig {}
-message JsAstToHirConfig {}
+message JsAstToJsirConfig {}
-message JsHirToAstConfig {}
+message JsirToAstConfig {}
// =============================================================================
// Analysis
diff --git a/maldoca/js/driver/internal/conversions.cc b/maldoca/js/driver/internal/conversions.cc
index e40b0ddf..c6ff1103 100644
--- a/maldoca/js/driver/internal/conversions.cc
+++ b/maldoca/js/driver/internal/conversions.cc
@@ -72,13 +72,13 @@ absl::StatusOr> JsConversion::Create(
return std::make_unique();
}
- case JsConversionConfig::KindCase::kJsAstToHir: {
+ case JsConversionConfig::KindCase::kJsAstToJsir: {
MALDOCA_RET_CHECK(mlir_context != nullptr);
- return std::make_unique(mlir_context);
+ return std::make_unique(mlir_context);
}
- case JsConversionConfig::KindCase::kJsHirToAst: {
- return std::make_unique();
+ case JsConversionConfig::KindCase::kJsirToAst: {
+ return std::make_unique();
}
}
}
@@ -168,20 +168,20 @@ absl::StatusOr> JsAstToAstString::Convert(
// JsAstToHir
// =============================================================================
-absl::StatusOr> JsAstToHir::Convert(
- const JsAstRepr &from) {
- ABSL_ASSIGN_OR_RETURN(auto op, AstToJshirFile(*from.ast, mlir_context_));
- return std::make_unique(std::move(op), from.scopes,
- from.source_map);
+absl::StatusOr> JsAstToJsir::Convert(
+ const JsAstRepr& from) {
+ ABSL_ASSIGN_OR_RETURN(auto op, AstToJsirFile(*from.ast, mlir_context_));
+ return std::make_unique(std::move(op), from.scopes,
+ from.source_map);
}
// =============================================================================
// JsHirToAst
// =============================================================================
-absl::StatusOr> JsHirToAst::Convert(
- const JsHirRepr &from) {
- ABSL_ASSIGN_OR_RETURN(auto ast, JshirFileToAst(*from.op));
+absl::StatusOr> JsirToAst::Convert(
+ const JsirRepr& from) {
+ ABSL_ASSIGN_OR_RETURN(auto ast, JsirFileToAst(*from.op));
return std::make_unique(std::move(ast), from.scopes,
from.source_map);
}
diff --git a/maldoca/js/driver/internal/conversions.h b/maldoca/js/driver/internal/conversions.h
index bfb04203..e0bf77fb 100644
--- a/maldoca/js/driver/internal/conversions.h
+++ b/maldoca/js/driver/internal/conversions.h
@@ -176,16 +176,16 @@ class JsAstToAstString final
// +------+-----------------------------+-------------------------------+
// | To | mlir::OwningOpRef | JavaScript high-level IR |
// +------+-----------------------------+-------------------------------+
-class JsAstToHir final : public JsConversionTmpl {
+class JsAstToJsir final : public JsConversionTmpl {
public:
- explicit JsAstToHir(mlir::MLIRContext *absl_nonnull mlir_context)
+ explicit JsAstToJsir(mlir::MLIRContext* absl_nonnull mlir_context)
: mlir_context_(*mlir_context) {}
- std::string name() const override { return "JsAstToHir"; }
+ std::string name() const override { return "JsAstToJsir"; }
private:
- absl::StatusOr> Convert(
- const JsAstRepr &from) override;
+ absl::StatusOr> Convert(
+ const JsAstRepr& from) override;
mlir::MLIRContext &mlir_context_;
};
@@ -197,15 +197,15 @@ class JsAstToHir final : public JsConversionTmpl {
// +------+-------------------------------+-------------------------------+
// | To | std::unique_ptr | JavaScript AST |
// +------+-------------------------------+-------------------------------+
-class JsHirToAst final : public JsConversionTmpl {
+class JsirToAst final : public JsConversionTmpl {
public:
- explicit JsHirToAst() = default;
+ explicit JsirToAst() = default;
- std::string name() const override { return "JsHirToAst"; }
+ std::string name() const override { return "JsirToAst"; }
private:
absl::StatusOr> Convert(
- const JsHirRepr &from) override;
+ const JsirRepr& from) override;
};
} // namespace maldoca
diff --git a/maldoca/js/ir/BUILD b/maldoca/js/ir/BUILD
index 7bb11954..55a64391 100644
--- a/maldoca/js/ir/BUILD
+++ b/maldoca/js/ir/BUILD
@@ -86,20 +86,6 @@ gentbl_cc_library(
],
"jsir_dialect.cc.inc",
),
- (
- [
- "-gen-dialect-decls",
- "-dialect=jshir",
- ],
- "jshir_dialect.h.inc",
- ),
- (
- [
- "-gen-dialect-defs",
- "-dialect=jshir",
- ],
- "jshir_dialect.cc.inc",
- ),
],
tblgen = "@llvm-project//mlir:mlir-tblgen",
td_file = "jsir_attrs.td",
@@ -207,31 +193,15 @@ gentbl_cc_library(
(
[
"-gen-op-decls",
- "-op-include-regex=jsir",
],
"jsir_ops.h.inc",
),
(
[
"-gen-op-defs",
- "-op-include-regex=jsir",
],
"jsir_ops.cc.inc",
),
- (
- [
- "-gen-op-decls",
- "-op-include-regex=jshir",
- ],
- "jshir_ops.h.inc",
- ),
- (
- [
- "-gen-op-defs",
- "-op-include-regex=jshir",
- ],
- "jshir_ops.cc.inc",
- ),
],
tblgen = "@llvm-project//mlir:mlir-tblgen",
td_file = "jsir_ops.td",
@@ -244,7 +214,6 @@ cc_library(
name = "ir",
srcs = [
"ir.cc",
- "jshir_ops.cc",
"jsir_ops.cc",
],
hdrs = ["ir.h"],
diff --git a/maldoca/js/ir/analyses/conditional_forward_dataflow_analysis.h b/maldoca/js/ir/analyses/conditional_forward_dataflow_analysis.h
index 78eeda80..ef5ed9e9 100644
--- a/maldoca/js/ir/analyses/conditional_forward_dataflow_analysis.h
+++ b/maldoca/js/ir/analyses/conditional_forward_dataflow_analysis.h
@@ -114,18 +114,17 @@ void JsirConditionalForwardDataFlowAnalysis::VisitOp(
// Don't call the user-defined `VisitOp` if this is an op with a fixed
// standard visitor.
// TODO(b/425421947): Create MLIR trait rather than having a list of ops here.
- if (llvm::isa(op) ||
- llvm::isa(op) ||
- llvm::isa(op) ||
- llvm::isa(op) ||
- llvm::isa(op) ||
- llvm::isa(op) ||
- llvm::isa(op) ||
- llvm::isa(op) ||
- llvm::isa(op) || llvm::isa(op) ||
- llvm::isa(op) ||
- llvm::isa(op) ||
- llvm::isa(op)) {
+ if (llvm::isa(op) ||
+ llvm::isa(op) ||
+ llvm::isa(op) ||
+ llvm::isa(op) ||
+ llvm::isa(op) ||
+ llvm::isa(op) ||
+ llvm::isa(op) ||
+ llvm::isa(op) ||
+ llvm::isa(op) || llvm::isa(op) ||
+ llvm::isa(op) || llvm::isa(op) ||
+ llvm::isa(op)) {
return;
}
VisitOp(op, operands, before, result_state_refs, after_state_ref);
diff --git a/maldoca/js/ir/analyses/conditional_forward_per_var_dataflow_analysis.h b/maldoca/js/ir/analyses/conditional_forward_per_var_dataflow_analysis.h
index 957b23cb..d4f1d9ae 100644
--- a/maldoca/js/ir/analyses/conditional_forward_per_var_dataflow_analysis.h
+++ b/maldoca/js/ir/analyses/conditional_forward_per_var_dataflow_analysis.h
@@ -67,7 +67,7 @@ class JsirConditionalForwardPerVarDataFlowAnalysis
//
// ```
//
- // jshir.if_statement (%cond) {
+ // jsir.if_statement (%cond) {
//
// }, {
//
diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/and/README.generated.md
index 58220b3f..397963c7 100644
--- a/maldoca/js/ir/analyses/constant_propagation/tests/and/README.generated.md
+++ b/maldoca/js/ir/analyses/constant_propagation/tests/and/README.generated.md
@@ -3,6 +3,6 @@ To run manually:
```shell
bazel run //maldoca/js/ir:jsir_gen -- \
--input_file $(pwd)/maldoca/js/ir/analyses/constant_propagation/tests/and/input.js \
- --passes "source2ast,ast2hir" \
+ --passes "source2ast,ast2jsir" \
--jsir_analysis constant_propagation
```
diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/and/output.generated.txt
index 8dda7939..7ee8093b 100644
--- a/maldoca/js/ir/analyses/constant_propagation/tests/and/output.generated.txt
+++ b/maldoca/js/ir/analyses/constant_propagation/tests/and/output.generated.txt
@@ -1,254 +1,254 @@
-// JSHIR: "jsir.file"() <{comments = []}> ({
-// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({
-// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({
-// JSHIR-NEXT: %16 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any
-// JSHIR-NEXT: %17 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any
-// JSHIR-NEXT: %18 = "jshir.logical_expression"(%17) <{operator_ = "&&"}> ({
-// JSHIR-NEXT: %20 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any
-// JSHIR-NEXT: "jsir.expr_region_end"(%20) : (!jsir.any) -> ()
-// JSHIR-NEXT: }) : (!jsir.any) -> !jsir.any
-// JSHIR-NEXT: %19 = "jsir.variable_declarator"(%16, %18) : (!jsir.any, !jsir.any) -> !jsir.any
-// JSHIR-NEXT: "jsir.exprs_region_end"(%19) : (!jsir.any) -> ()
-// JSHIR-NEXT: }) : () -> ()
-// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({
-// JSHIR-NEXT: %16 = "jsir.identifier_ref"() <{name = "b"}> : () -> !jsir.any
-// JSHIR-NEXT: %17 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any
-// JSHIR-NEXT: %18 = "jshir.logical_expression"(%17) <{operator_ = "&&"}> ({
-// JSHIR-NEXT: %20 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any
-// JSHIR-NEXT: "jsir.expr_region_end"(%20) : (!jsir.any) -> ()
-// JSHIR-NEXT: }) : (!jsir.any) -> !jsir.any
-// JSHIR-NEXT: %19 = "jsir.variable_declarator"(%16, %18) : (!jsir.any, !jsir.any) -> !jsir.any
-// JSHIR-NEXT: "jsir.exprs_region_end"(%19) : (!jsir.any) -> ()
-// JSHIR-NEXT: }) : () -> ()
-// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({
-// JSHIR-NEXT: %16 = "jsir.identifier_ref"() <{name = "c"}> : () -> !jsir.any
-// JSHIR-NEXT: %17 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any
-// JSHIR-NEXT: %18 = "jshir.logical_expression"(%17) <{operator_ = "&&"}> ({
-// JSHIR-NEXT: %20 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any
-// JSHIR-NEXT: "jsir.expr_region_end"(%20) : (!jsir.any) -> ()
-// JSHIR-NEXT: }) : (!jsir.any) -> !jsir.any
-// JSHIR-NEXT: %19 = "jsir.variable_declarator"(%16, %18) : (!jsir.any, !jsir.any) -> !jsir.any
-// JSHIR-NEXT: "jsir.exprs_region_end"(%19) : (!jsir.any) -> ()
-// JSHIR-NEXT: }) : () -> ()
-// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({
-// JSHIR-NEXT: %16 = "jsir.identifier_ref"() <{name = "d"}> : () -> !jsir.any
-// JSHIR-NEXT: %17 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any
-// JSHIR-NEXT: %18 = "jshir.logical_expression"(%17) <{operator_ = "&&"}> ({
-// JSHIR-NEXT: %20 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any
-// JSHIR-NEXT: "jsir.expr_region_end"(%20) : (!jsir.any) -> ()
-// JSHIR-NEXT: }) : (!jsir.any) -> !jsir.any
-// JSHIR-NEXT: %19 = "jsir.variable_declarator"(%16, %18) : (!jsir.any, !jsir.any) -> !jsir.any
-// JSHIR-NEXT: "jsir.exprs_region_end"(%19) : (!jsir.any) -> ()
-// JSHIR-NEXT: }) : () -> ()
-// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any
-// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 93, 96, 0, "log">}> : (!jsir.any) -> !jsir.any
-// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any
-// JSHIR-NEXT: %3 = "jsir.call_expression"(%1, %2) : (!jsir.any, !jsir.any) -> !jsir.any
-// JSHIR-NEXT: "jsir.expression_statement"(%3) : (!jsir.any) -> ()
-// JSHIR-NEXT: %4 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any
-// JSHIR-NEXT: %5 = "jsir.member_expression"(%4) <{literal_property = #jsir, , "log", 109, 112, 0, "log">}> : (!jsir.any) -> !jsir.any
-// JSHIR-NEXT: %6 = "jsir.identifier"() <{name = "b"}> : () -> !jsir.any
-// JSHIR-NEXT: %7 = "jsir.call_expression"(%5, %6) : (!jsir.any, !jsir.any) -> !jsir.any
-// JSHIR-NEXT: "jsir.expression_statement"(%7) : (!jsir.any) -> ()
-// JSHIR-NEXT: %8 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any
-// JSHIR-NEXT: %9 = "jsir.member_expression"(%8) <{literal_property = #jsir, , "log", 125, 128, 0, "log">}> : (!jsir.any) -> !jsir.any
-// JSHIR-NEXT: %10 = "jsir.identifier"() <{name = "c"}> : () -> !jsir.any
-// JSHIR-NEXT: %11 = "jsir.call_expression"(%9, %10) : (!jsir.any, !jsir.any) -> !jsir.any
-// JSHIR-NEXT: "jsir.expression_statement"(%11) : (!jsir.any) -> ()
-// JSHIR-NEXT: %12 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any
-// JSHIR-NEXT: %13 = "jsir.member_expression"(%12) <{literal_property = #jsir, , "log", 141, 144, 0, "log">}> : (!jsir.any) -> !jsir.any
-// JSHIR-NEXT: %14 = "jsir.identifier"() <{name = "d"}> : () -> !jsir.any
-// JSHIR-NEXT: %15 = "jsir.call_expression"(%13, %14) : (!jsir.any, !jsir.any) -> !jsir.any
-// JSHIR-NEXT: "jsir.expression_statement"(%15) : (!jsir.any) -> ()
-// JSHIR-NEXT: }, {
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: }) : () -> ()
-// JSHIR-NEXT: }) : () -> ()
-// JSHIR-NEXT: jsir.file {[]} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.program {"script"} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.variable_declaration {"var"} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %16 = jsir.identifier_ref {"a"}
-// JSHIR-NEXT: // %16 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %17 = jsir.boolean_literal {false}
-// JSHIR-NEXT: // %17 = false
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %18 = jshir.logical_expression (%17) {"&&"} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %20 = jsir.boolean_literal {true}
-// JSHIR-NEXT: // %20 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.expr_region_end (%20)
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: })
-// JSHIR-NEXT: // %18 = false
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %19 = jsir.variable_declarator (%16, %18)
-// JSHIR-NEXT: // %19 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.exprs_region_end (%19)
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: })
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.variable_declaration {"var"} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %16 = jsir.identifier_ref {"b"}
-// JSHIR-NEXT: // %16 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %17 = jsir.boolean_literal {true}
-// JSHIR-NEXT: // %17 = true
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %18 = jshir.logical_expression (%17) {"&&"} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %20 = jsir.boolean_literal {false}
-// JSHIR-NEXT: // %20 = false
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.expr_region_end (%20)
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: })
-// JSHIR-NEXT: // %18 = false
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %19 = jsir.variable_declarator (%16, %18)
-// JSHIR-NEXT: // %19 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.exprs_region_end (%19)
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: })
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.variable_declaration {"var"} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %16 = jsir.identifier_ref {"c"}
-// JSHIR-NEXT: // %16 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %17 = jsir.identifier {"x"}
-// JSHIR-NEXT: // %17 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %18 = jshir.logical_expression (%17) {"&&"} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %20 = jsir.boolean_literal {true}
-// JSHIR-NEXT: // %20 = true
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.expr_region_end (%20)
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: })
-// JSHIR-NEXT: // %18 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %19 = jsir.variable_declarator (%16, %18)
-// JSHIR-NEXT: // %19 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.exprs_region_end (%19)
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: })
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.variable_declaration {"var"} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %16 = jsir.identifier_ref {"d"}
-// JSHIR-NEXT: // %16 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %17 = jsir.identifier {"x"}
-// JSHIR-NEXT: // %17 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %18 = jshir.logical_expression (%17) {"&&"} ({
-// JSHIR-NEXT: ^bb0:
-// JSHIR-NEXT: //
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %20 = jsir.boolean_literal {false}
-// JSHIR-NEXT: // %20 = false
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.expr_region_end (%20)
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: })
-// JSHIR-NEXT: // %18 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %19 = jsir.variable_declarator (%16, %18)
-// JSHIR-NEXT: // %19 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: jsir.exprs_region_end (%19)
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: })
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %0 = jsir.identifier {"console"}
-// JSHIR-NEXT: // %0 =
-// JSHIR-NEXT: // State [default = ] { }
-// JSHIR-NEXT: %1 = jsir.member_expression (%0) {#jsir, , "log", 93, 96, 0, "log">}
-// JSHIR-NEXT: // %1 =
-// JSHIR-NEXT: // State [default = ] {