From 46b03d8216db7eda8a71ac1e059218a724c3b006 Mon Sep 17 00:00:00 2001 From: Md Jabir Hossain Date: Mon, 4 Aug 2025 23:02:15 +0000 Subject: [PATCH] Include constant propagation analyses tests --- .../constant_propagation/tests/and/BUILD | 32 ++ .../tests/and/README.generated.md | 8 + .../constant_propagation/tests/and/input.js | 8 + .../tests/and/output.generated.txt | 318 ++++++++++++++++ .../tests/and/run.generated.lit | 5 + .../tests/and_jshir/BUILD | 32 ++ .../tests/and_jshir/README.generated.md | 8 + .../tests/and_jshir/input.js | 8 + .../tests/and_jshir/output.generated.txt | 254 +++++++++++++ .../tests/and_jshir/run.generated.lit | 5 + .../constant_propagation/tests/break/BUILD | 32 ++ .../tests/break/README.generated.md | 8 + .../constant_propagation/tests/break/input.js | 6 + .../tests/break/output.generated.txt | 144 +++++++ .../tests/break/run.generated.lit | 5 + .../tests/break_jshir/BUILD | 32 ++ .../tests/break_jshir/README.generated.md | 8 + .../tests/break_jshir/input.js | 6 + .../tests/break_jshir/output.generated.txt | 116 ++++++ .../tests/break_jshir/run.generated.lit | 5 + .../tests/conditional/BUILD | 32 ++ .../tests/conditional/README.generated.md | 8 + .../tests/conditional/input.js | 6 + .../tests/conditional/output.generated.txt | 286 ++++++++++++++ .../tests/conditional/run.generated.lit | 5 + .../tests/conditional_jshir/BUILD | 32 ++ .../conditional_jshir/README.generated.md | 8 + .../tests/conditional_jshir/input.js | 6 + .../conditional_jshir/output.generated.txt | 232 ++++++++++++ .../tests/conditional_jshir/run.generated.lit | 5 + .../constant_propagation/tests/continue/BUILD | 32 ++ .../tests/continue/README.generated.md | 8 + .../tests/continue/input.js | 6 + .../tests/continue/output.generated.txt | 206 +++++++++++ .../tests/continue/run.generated.lit | 5 + .../tests/continue_jshir/BUILD | 32 ++ .../tests/continue_jshir/README.generated.md | 8 + .../tests/continue_jshir/input.js | 6 + .../tests/continue_jshir/output.generated.txt | 168 +++++++++ .../tests/continue_jshir/run.generated.lit | 5 + .../constant_propagation/tests/do_while/BUILD | 32 ++ .../tests/do_while/README.generated.md | 8 + .../tests/do_while/input.js | 7 + .../tests/do_while/output.generated.txt | 184 +++++++++ .../tests/do_while/run.generated.lit | 5 + .../tests/do_while_jshir/BUILD | 32 ++ .../tests/do_while_jshir/README.generated.md | 8 + .../tests/do_while_jshir/input.js | 7 + .../tests/do_while_jshir/output.generated.txt | 163 ++++++++ .../tests/do_while_jshir/run.generated.lit | 5 + .../constant_propagation/tests/for/BUILD | 32 ++ .../tests/for/README.generated.md | 8 + .../constant_propagation/tests/for/input.js | 2 + .../tests/for/output.generated.txt | 145 ++++++++ .../tests/for/run.generated.lit | 5 + .../constant_propagation/tests/for_in/BUILD | 32 ++ .../tests/for_in/README.generated.md | 8 + .../tests/for_in/input.js | 7 + .../tests/for_in/output.generated.txt | 193 ++++++++++ .../tests/for_in/run.generated.lit | 5 + .../tests/for_in_jshir/BUILD | 32 ++ .../tests/for_in_jshir/README.generated.md | 8 + .../tests/for_in_jshir/input.js | 7 + .../tests/for_in_jshir/output.generated.txt | 163 ++++++++ .../tests/for_in_jshir/run.generated.lit | 5 + .../tests/for_jshir/BUILD | 32 ++ .../tests/for_jshir/README.generated.md | 8 + .../tests/for_jshir/input.js | 2 + .../tests/for_jshir/output.generated.txt | 113 ++++++ .../tests/for_jshir/run.generated.lit | 5 + .../constant_propagation/tests/for_of/BUILD | 32 ++ .../tests/for_of/README.generated.md | 8 + .../tests/for_of/input.js | 6 + .../tests/for_of/output.generated.txt | 166 +++++++++ .../tests/for_of/run.generated.lit | 5 + .../tests/for_of_jshir/BUILD | 32 ++ .../tests/for_of_jshir/README.generated.md | 8 + .../tests/for_of_jshir/input.js | 6 + .../tests/for_of_jshir/output.generated.txt | 136 +++++++ .../tests/for_of_jshir/run.generated.lit | 5 + .../constant_propagation/tests/function/BUILD | 32 ++ .../tests/function/README.generated.md | 8 + .../tests/function/input.js | 5 + .../tests/function/output.generated.txt | 116 ++++++ .../tests/function/run.generated.lit | 5 + .../constant_propagation/tests/if/BUILD | 32 ++ .../tests/if/README.generated.md | 8 + .../constant_propagation/tests/if/input.js | 4 + .../tests/if/output.generated.txt | 94 +++++ .../tests/if/run.generated.lit | 5 + .../tests/if_var_dead/BUILD | 32 ++ .../tests/if_var_dead/README.generated.md | 8 + .../tests/if_var_dead/input.js | 6 + .../tests/if_var_dead/output.generated.txt | 120 ++++++ .../tests/if_var_dead/run.generated.lit | 5 + .../tests/if_var_dead_jshir/BUILD | 32 ++ .../if_var_dead_jshir/README.generated.md | 8 + .../tests/if_var_dead_jshir/input.js | 6 + .../if_var_dead_jshir/output.generated.txt | 95 +++++ .../tests/if_var_dead_jshir/run.generated.lit | 5 + .../tests/if_var_unknown/BUILD | 32 ++ .../tests/if_var_unknown/README.generated.md | 8 + .../tests/if_var_unknown/input.js | 6 + .../tests/if_var_unknown/output.generated.txt | 120 ++++++ .../tests/if_var_unknown/run.generated.lit | 5 + .../tests/if_var_unknown_jshir/BUILD | 32 ++ .../if_var_unknown_jshir/README.generated.md | 8 + .../tests/if_var_unknown_jshir/input.js | 6 + .../if_var_unknown_jshir/output.generated.txt | 95 +++++ .../if_var_unknown_jshir/run.generated.lit | 5 + .../constant_propagation/tests/label/BUILD | 32 ++ .../tests/label/README.generated.md | 8 + .../constant_propagation/tests/label/input.js | 9 + .../tests/label/output.generated.txt | 221 +++++++++++ .../tests/label/run.generated.lit | 5 + .../tests/label_jshir/BUILD | 32 ++ .../tests/label_jshir/README.generated.md | 8 + .../tests/label_jshir/input.js | 9 + .../tests/label_jshir/output.generated.txt | 173 +++++++++ .../tests/label_jshir/run.generated.lit | 5 + .../constant_propagation/tests/literal/BUILD | 32 ++ .../tests/literal/README.generated.md | 8 + .../tests/literal/input.js | 17 + .../tests/literal/output.generated.txt | 64 ++++ .../tests/literal/run.generated.lit | 5 + .../tests/nullish_coalesce/BUILD | 32 ++ .../nullish_coalesce/README.generated.md | 8 + .../tests/nullish_coalesce/input.js | 8 + .../nullish_coalesce/output.generated.txt | 350 ++++++++++++++++++ .../tests/nullish_coalesce/run.generated.lit | 5 + .../tests/nullish_coalesce_jshir/BUILD | 32 ++ .../README.generated.md | 8 + .../tests/nullish_coalesce_jshir/input.js | 8 + .../output.generated.txt | 254 +++++++++++++ .../nullish_coalesce_jshir/run.generated.lit | 5 + .../tests/obfuscated/BUILD | 32 ++ .../tests/obfuscated/README.generated.md | 8 + .../tests/obfuscated/input.js | 9 + .../tests/obfuscated/output.generated.txt | 221 +++++++++++ .../tests/obfuscated/run.generated.lit | 5 + .../constant_propagation/tests/or/BUILD | 32 ++ .../tests/or/README.generated.md | 8 + .../constant_propagation/tests/or/input.js | 8 + .../tests/or/output.generated.txt | 318 ++++++++++++++++ .../tests/or/run.generated.lit | 5 + .../constant_propagation/tests/or_jshir/BUILD | 32 ++ .../tests/or_jshir/README.generated.md | 8 + .../tests/or_jshir/input.js | 8 + .../tests/or_jshir/output.generated.txt | 254 +++++++++++++ .../tests/or_jshir/run.generated.lit | 5 + .../constant_propagation/tests/simple/BUILD | 32 ++ .../tests/simple/README.generated.md | 8 + .../tests/simple/input.js | 1 + .../tests/simple/output.generated.txt | 37 ++ .../tests/simple/run.generated.lit | 5 + .../tests/simple_symbol/BUILD | 32 ++ .../tests/simple_symbol/README.generated.md | 8 + .../tests/simple_symbol/input.js | 2 + .../tests/simple_symbol/output.generated.txt | 60 +++ .../tests/simple_symbol/run.generated.lit | 5 + .../constant_propagation/tests/switch/BUILD | 32 ++ .../tests/switch/README.generated.md | 8 + .../tests/switch/input.js | 13 + .../tests/switch/output.generated.txt | 289 +++++++++++++++ .../tests/switch/run.generated.lit | 5 + .../tests/try_catch/BUILD | 32 ++ .../tests/try_catch/README.generated.md | 8 + .../tests/try_catch/input.js | 9 + .../tests/try_catch/output.generated.txt | 199 ++++++++++ .../tests/try_catch/run.generated.lit | 5 + .../tests/try_catch_jshir/BUILD | 32 ++ .../tests/try_catch_jshir/README.generated.md | 8 + .../tests/try_catch_jshir/input.js | 9 + .../try_catch_jshir/output.generated.txt | 181 +++++++++ .../tests/try_catch_jshir/run.generated.lit | 5 + .../tests/undeclared_var/BUILD | 32 ++ .../tests/undeclared_var/README.generated.md | 8 + .../tests/undeclared_var/input.js | 2 + .../tests/undeclared_var/output.generated.txt | 60 +++ .../tests/undeclared_var/run.generated.lit | 5 + .../tests/update_expression/BUILD | 32 ++ .../update_expression/README.generated.md | 8 + .../tests/update_expression/input.js | 10 + .../update_expression/output.generated.txt | 123 ++++++ .../tests/update_expression/run.generated.lit | 5 + .../constant_propagation/tests/void_0/BUILD | 32 ++ .../tests/void_0/README.generated.md | 8 + .../tests/void_0/input.js | 1 + .../tests/void_0/output.generated.txt | 49 +++ .../tests/void_0/run.generated.lit | 5 + .../constant_propagation/tests/while/BUILD | 32 ++ .../tests/while/README.generated.md | 8 + .../constant_propagation/tests/while/input.js | 9 + .../tests/while/output.generated.txt | 184 +++++++++ .../tests/while/run.generated.lit | 5 + .../tests/while_dead_jshir/BUILD | 32 ++ .../while_dead_jshir/README.generated.md | 8 + .../tests/while_dead_jshir/input.js | 5 + .../while_dead_jshir/output.generated.txt | 113 ++++++ .../tests/while_dead_jshir/run.generated.lit | 5 + .../tests/while_jshir/BUILD | 32 ++ .../tests/while_jshir/README.generated.md | 8 + .../tests/while_jshir/input.js | 9 + .../tests/while_jshir/output.generated.txt | 163 ++++++++ .../tests/while_jshir/run.generated.lit | 5 + 205 files changed, 9060 insertions(+) create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/function/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/function/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/function/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/function/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/function/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/literal/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/literal/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/literal/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/literal/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/literal/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/switch/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/switch/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/switch/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/switch/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/switch/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/update_expression/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/update_expression/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/update_expression/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/update_expression/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/update_expression/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/void_0/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/void_0/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/void_0/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/void_0/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/void_0/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/run.generated.lit create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/BUILD create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/README.generated.md create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/input.js create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/output.generated.txt create mode 100644 maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/run.generated.lit diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/and/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) 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 new file mode 100644 index 0000000..16679b7 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/and/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/and/input.js new file mode 100644 index 0000000..73cdb43 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and/input.js @@ -0,0 +1,8 @@ +var a = false && true; +var b = true && false; +var c = x && true; +var d = x && false; +console.log(a); +console.log(b); +console.log(c); +console.log(d); 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 new file mode 100644 index 0000000..2e0ae85 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and/output.generated.txt @@ -0,0 +1,318 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %37 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %38 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: %39 = "jslir.logical_expression_start"(%38) <{operator_ = "&&"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %40 = "builtin.unrealized_conversion_cast"(%38) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%40, %38)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%39) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %41 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%41)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%42: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%39) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %43 = "jsir.variable_declarator"(%37, %42) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%43) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %30 = "jsir.identifier_ref"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %31 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %32 = "jslir.logical_expression_start"(%31) <{operator_ = "&&"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %33 = "builtin.unrealized_conversion_cast"(%31) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%33, %31)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%32) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %34 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%34)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%35: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%32) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %36 = "jsir.variable_declarator"(%30, %35) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%36) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %23 = "jsir.identifier_ref"() <{name = "c"}> : () -> !jsir.any +// JSLIR-NEXT: %24 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %25 = "jslir.logical_expression_start"(%24) <{operator_ = "&&"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %26 = "builtin.unrealized_conversion_cast"(%24) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%26, %24)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%25) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %27 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%27)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%28: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%25) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %29 = "jsir.variable_declarator"(%23, %28) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%29) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %16 = "jsir.identifier_ref"() <{name = "d"}> : () -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %18 = "jslir.logical_expression_start"(%17) <{operator_ = "&&"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %19 = "builtin.unrealized_conversion_cast"(%17) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%19, %17)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%18) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %20 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%20)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%21: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%18) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %22 = "jsir.variable_declarator"(%16, %21) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%22) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 93, 96, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.call_expression"(%1, %2) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%3) : (!jsir.any) -> () +// JSLIR-NEXT: %4 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.member_expression"(%4) <{literal_property = #jsir, , "log", 109, 112, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.identifier"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.call_expression"(%5, %6) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%7) : (!jsir.any) -> () +// JSLIR-NEXT: %8 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.member_expression"(%8) <{literal_property = #jsir, , "log", 125, 128, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.identifier"() <{name = "c"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.call_expression"(%9, %10) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%11) : (!jsir.any) -> () +// JSLIR-NEXT: %12 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.member_expression"(%12) <{literal_property = #jsir, , "log", 141, 144, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.identifier"() <{name = "d"}> : () -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.call_expression"(%13, %14) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%15) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %37 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %37 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %38 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %38 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %39 = jslir.logical_expression_start (%38) {"&&"} +// JSLIR-NEXT: // %39 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %40 = builtin.unrealized_conversion_cast (%38) +// JSLIR-NEXT: // %40 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%40, %38) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%39) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %41 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %41 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%41) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%39) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %43 = jsir.variable_declarator (%37, %42) +// JSLIR-NEXT: // %43 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%43) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %30 = jsir.identifier_ref {"b"} +// JSLIR-NEXT: // %30 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %31 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %31 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %32 = jslir.logical_expression_start (%31) {"&&"} +// JSLIR-NEXT: // %32 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %33 = builtin.unrealized_conversion_cast (%31) +// JSLIR-NEXT: // %33 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%33, %31) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%32) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %34 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %34 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%34) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%32) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %36 = jsir.variable_declarator (%30, %35) +// JSLIR-NEXT: // %36 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%36) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %23 = jsir.identifier_ref {"c"} +// JSLIR-NEXT: // %23 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %24 = jsir.identifier {"x"} +// JSLIR-NEXT: // %24 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %25 = jslir.logical_expression_start (%24) {"&&"} +// JSLIR-NEXT: // %25 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %26 = builtin.unrealized_conversion_cast (%24) +// JSLIR-NEXT: // %26 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%26, %24) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%25) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %27 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %27 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%27) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%25) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %29 = jsir.variable_declarator (%23, %28) +// JSLIR-NEXT: // %29 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%29) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.identifier_ref {"d"} +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.identifier {"x"} +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jslir.logical_expression_start (%17) {"&&"} +// JSLIR-NEXT: // %18 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = builtin.unrealized_conversion_cast (%17) +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%19, %17) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%18) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %20 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%20) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%18) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %22 = jsir.variable_declarator (%16, %21) +// JSLIR-NEXT: // %22 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%22) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier {"console"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.member_expression (%0) {#jsir, , "log", 93, 96, 0, "log">} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.identifier {"a"} +// JSLIR-NEXT: // %2 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%3) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.identifier {"console"} +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 109, 112, 0, "log">} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.identifier {"b"} +// JSLIR-NEXT: // %6 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%7) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.identifier {"console"} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.member_expression (%8) {#jsir, , "log", 125, 128, 0, "log">} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.identifier {"c"} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.call_expression (%9, %10) +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%11) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.identifier {"console"} +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.member_expression (%12) {#jsir, , "log", 141, 144, 0, "log">} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.identifier {"d"} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.call_expression (%13, %14) +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%15) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/and/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/README.generated.md new file mode 100644 index 0000000..c39461a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/input.js new file mode 100644 index 0000000..73cdb43 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/input.js @@ -0,0 +1,8 @@ +var a = false && true; +var b = true && false; +var c = x && true; +var d = x && false; +console.log(a); +console.log(b); +console.log(c); +console.log(d); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/output.generated.txt new file mode 100644 index 0000000..8dda793 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/output.generated.txt @@ -0,0 +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 = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"a"} +// JSHIR-NEXT: // %2 = false +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier {"console"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 109, 112, 0, "log">} +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.identifier {"b"} +// JSHIR-NEXT: // %6 = false +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%7) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier {"console"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.member_expression (%8) {#jsir, , "log", 125, 128, 0, "log">} +// JSHIR-NEXT: // %9 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.identifier {"c"} +// JSHIR-NEXT: // %10 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %11 = jsir.call_expression (%9, %10) +// JSHIR-NEXT: // %11 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%11) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %12 = jsir.identifier {"console"} +// JSHIR-NEXT: // %12 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %13 = jsir.member_expression (%12) {#jsir, , "log", 141, 144, 0, "log">} +// JSHIR-NEXT: // %13 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %14 = jsir.identifier {"d"} +// JSHIR-NEXT: // %14 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %15 = jsir.call_expression (%13, %14) +// JSHIR-NEXT: // %15 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%15) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/and_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/break/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/break/README.generated.md new file mode 100644 index 0000000..63cab44 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/break/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/break/input.js new file mode 100644 index 0000000..b481272 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break/input.js @@ -0,0 +1,6 @@ +var x = 3; +while (true) { + break; + x = 2; +} +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/break/output.generated.txt new file mode 100644 index 0000000..0c9433f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break/output.generated.txt @@ -0,0 +1,144 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %11 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.variable_declarator"(%11, %12) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%13) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // 2 preds: ^bb0, ^bb3 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %1 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "builtin.unrealized_conversion_cast"(%1) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%2)[^bb2, ^bb4] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %3 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%3) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%3) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.break_statement"() : () -> () +// JSLIR-NEXT: "cf.br"()[^bb4] : () -> () +// JSLIR-NEXT: ^bb3: // no predecessors +// JSLIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.assignment_expression"(%4, %5) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%6) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%3) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb4: // 2 preds: ^bb1, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %7 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.member_expression"(%7) <{literal_property = #jsir, , "log", 54, 57, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.call_expression"(%8, %9) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%10) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSLIR-NEXT: // %12 = 3.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.variable_declarator (%11, %12) +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%13) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %1 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = builtin.unrealized_conversion_cast (%1) +// JSLIR-NEXT: // %2 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%2) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%3) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%3) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.break_statement +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.assignment_expression (%4, %5) {"="} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%6) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%3) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb4: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.identifier {"console"} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.member_expression (%7) {#jsir, , "log", 54, 57, 0, "log">} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.identifier {"x"} +// JSLIR-NEXT: // %9 = 3.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.call_expression (%8, %9) +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%10) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/break/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/README.generated.md new file mode 100644 index 0000000..7ad7565 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/input.js new file mode 100644 index 0000000..b481272 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/input.js @@ -0,0 +1,6 @@ +var x = 3; +while (true) { + break; + x = 2; +} +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/output.generated.txt new file mode 100644 index 0000000..611b049 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/output.generated.txt @@ -0,0 +1,116 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.variable_declarator"(%4, %5) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jshir.while_statement"() ({ +// JSHIR-NEXT: %4 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%4) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: "jshir.break_statement"() : () -> () +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.assignment_expression"(%4, %5) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 54, 57, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "x"}> : () -> !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: }, { +// 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: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 3.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.variable_declarator (%4, %5) +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.while_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.boolean_literal {true} +// JSHIR-NEXT: // %4 = true +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%4) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.break_statement +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 2.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.assignment_expression (%4, %5) {"="} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// 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", 54, 57, 0, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"x"} +// JSHIR-NEXT: // %2 = 3.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/break_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/README.generated.md new file mode 100644 index 0000000..c412c50 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/conditional/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/input.js new file mode 100644 index 0000000..d6c9d58 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/input.js @@ -0,0 +1,6 @@ +var a = true ? 1 : 2; +var b = false ? 3 : 4; +var c = x ? 5 : 6; +console.log(a); +console.log(b); +console.log(c); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/output.generated.txt new file mode 100644 index 0000000..613f9e4 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/output.generated.txt @@ -0,0 +1,286 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %28 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %29 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %30 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: %31 = "builtin.unrealized_conversion_cast"(%29) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%31)[^bb2, ^bb1] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%30) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %32 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%32)[^bb3] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%30) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %33 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%33)[^bb3] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb3(%34: !jsir.any): // 2 preds: ^bb1, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%30) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %35 = "jsir.variable_declarator"(%28, %34) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%35) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %20 = "jsir.identifier_ref"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %21 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: %22 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: %23 = "builtin.unrealized_conversion_cast"(%21) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%23)[^bb2, ^bb1] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%22) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %24 = "jsir.numeric_literal"() <{extra = #jsir, value = 4.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%24)[^bb3] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%22) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %25 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%25)[^bb3] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb3(%26: !jsir.any): // 2 preds: ^bb1, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%22) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %27 = "jsir.variable_declarator"(%20, %26) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%27) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %12 = "jsir.identifier_ref"() <{name = "c"}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %14 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: %15 = "builtin.unrealized_conversion_cast"(%13) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%15)[^bb2, ^bb1] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%14) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %16 = "jsir.numeric_literal"() <{extra = #jsir, value = 6.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%16)[^bb3] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%14) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %17 = "jsir.numeric_literal"() <{extra = #jsir, value = 5.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%17)[^bb3] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb3(%18: !jsir.any): // 2 preds: ^bb1, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%14) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %19 = "jsir.variable_declarator"(%12, %18) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%19) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 72, 75, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.call_expression"(%1, %2) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%3) : (!jsir.any) -> () +// JSLIR-NEXT: %4 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.member_expression"(%4) <{literal_property = #jsir, , "log", 88, 91, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.identifier"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.call_expression"(%5, %6) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%7) : (!jsir.any) -> () +// JSLIR-NEXT: %8 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.member_expression"(%8) <{literal_property = #jsir, , "log", 104, 107, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.identifier"() <{name = "c"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.call_expression"(%9, %10) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%11) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %28 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %28 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %29 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %29 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %30 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %30 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %31 = builtin.unrealized_conversion_cast (%29) +// JSLIR-NEXT: // %31 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%31) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%30) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %32 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %32 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%32) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%30) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %33 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %33 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%33) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%30) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %35 = jsir.variable_declarator (%28, %34) +// JSLIR-NEXT: // %35 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%35) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.identifier_ref {"b"} +// JSLIR-NEXT: // %20 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %21 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %21 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %22 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %22 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %23 = builtin.unrealized_conversion_cast (%21) +// JSLIR-NEXT: // %23 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%23) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%22) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %24 = jsir.numeric_literal {#jsir, 4.000000e+00 : f64} +// JSLIR-NEXT: // %24 = 4.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%24) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%22) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %25 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSLIR-NEXT: // %25 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%25) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%22) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %27 = jsir.variable_declarator (%20, %26) +// JSLIR-NEXT: // %27 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%27) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.identifier_ref {"c"} +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.identifier {"x"} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = builtin.unrealized_conversion_cast (%13) +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%15) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%14) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.numeric_literal {#jsir, 6.000000e+00 : f64} +// JSLIR-NEXT: // %16 = 6.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%16) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%14) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.numeric_literal {#jsir, 5.000000e+00 : f64} +// JSLIR-NEXT: // %17 = 5.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%17) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%14) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.variable_declarator (%12, %18) +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%19) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier {"console"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.member_expression (%0) {#jsir, , "log", 72, 75, 0, "log">} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.identifier {"a"} +// JSLIR-NEXT: // %2 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%3) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.identifier {"console"} +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 88, 91, 0, "log">} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.identifier {"b"} +// JSLIR-NEXT: // %6 = 4.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%7) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.identifier {"console"} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.member_expression (%8) {#jsir, , "log", 104, 107, 0, "log">} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.identifier {"c"} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.call_expression (%9, %10) +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%11) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/README.generated.md new file mode 100644 index 0000000..12579de --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/input.js new file mode 100644 index 0000000..d6c9d58 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/input.js @@ -0,0 +1,6 @@ +var a = true ? 1 : 2; +var b = false ? 3 : 4; +var c = x ? 5 : 6; +console.log(a); +console.log(b); +console.log(c); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/output.generated.txt new file mode 100644 index 0000000..f96d1a0 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/output.generated.txt @@ -0,0 +1,232 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %12 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSHIR-NEXT: %13 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSHIR-NEXT: %14 = "jshir.conditional_expression"(%13) ({ +// JSHIR-NEXT: %16 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%16) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %16 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%16) : (!jsir.any) -> () +// JSHIR-NEXT: }) : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %15 = "jsir.variable_declarator"(%12, %14) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%15) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %12 = "jsir.identifier_ref"() <{name = "b"}> : () -> !jsir.any +// JSHIR-NEXT: %13 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSHIR-NEXT: %14 = "jshir.conditional_expression"(%13) ({ +// JSHIR-NEXT: %16 = "jsir.numeric_literal"() <{extra = #jsir, value = 4.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%16) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %16 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%16) : (!jsir.any) -> () +// JSHIR-NEXT: }) : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %15 = "jsir.variable_declarator"(%12, %14) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%15) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %12 = "jsir.identifier_ref"() <{name = "c"}> : () -> !jsir.any +// JSHIR-NEXT: %13 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %14 = "jshir.conditional_expression"(%13) ({ +// JSHIR-NEXT: %16 = "jsir.numeric_literal"() <{extra = #jsir, value = 6.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%16) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %16 = "jsir.numeric_literal"() <{extra = #jsir, value = 5.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%16) : (!jsir.any) -> () +// JSHIR-NEXT: }) : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %15 = "jsir.variable_declarator"(%12, %14) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%15) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 72, 75, 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", 88, 91, 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", 104, 107, 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: }, { +// 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: %12 = jsir.identifier_ref {"a"} +// JSHIR-NEXT: // %12 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %13 = jsir.boolean_literal {true} +// JSHIR-NEXT: // %13 = true +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %14 = jshir.conditional_expression (%13) ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %16 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSHIR-NEXT: // %16 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%16) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %16 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %16 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%16) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // %14 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %15 = jsir.variable_declarator (%12, %14) +// JSHIR-NEXT: // %15 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%15) +// 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: %12 = jsir.identifier_ref {"b"} +// JSHIR-NEXT: // %12 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %13 = jsir.boolean_literal {false} +// JSHIR-NEXT: // %13 = false +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %14 = jshir.conditional_expression (%13) ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %16 = jsir.numeric_literal {#jsir, 4.000000e+00 : f64} +// JSHIR-NEXT: // %16 = 4.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%16) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %16 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSHIR-NEXT: // %16 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%16) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // %14 = 4.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %15 = jsir.variable_declarator (%12, %14) +// JSHIR-NEXT: // %15 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%15) +// 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: %12 = jsir.identifier_ref {"c"} +// JSHIR-NEXT: // %12 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %13 = jsir.identifier {"x"} +// JSHIR-NEXT: // %13 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %14 = jshir.conditional_expression (%13) ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %16 = jsir.numeric_literal {#jsir, 6.000000e+00 : f64} +// JSHIR-NEXT: // %16 = 6.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%16) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %16 = jsir.numeric_literal {#jsir, 5.000000e+00 : f64} +// JSHIR-NEXT: // %16 = 5.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%16) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // %14 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %15 = jsir.variable_declarator (%12, %14) +// JSHIR-NEXT: // %15 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%15) +// 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", 72, 75, 0, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"a"} +// JSHIR-NEXT: // %2 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier {"console"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 88, 91, 0, "log">} +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.identifier {"b"} +// JSHIR-NEXT: // %6 = 4.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%7) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier {"console"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.member_expression (%8) {#jsir, , "log", 104, 107, 0, "log">} +// JSHIR-NEXT: // %9 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.identifier {"c"} +// JSHIR-NEXT: // %10 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %11 = jsir.call_expression (%9, %10) +// JSHIR-NEXT: // %11 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%11) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/conditional_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/continue/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/continue/README.generated.md new file mode 100644 index 0000000..28447c1 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/continue/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/continue/input.js new file mode 100644 index 0000000..9e6cbf9 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue/input.js @@ -0,0 +1,6 @@ +var x = 3; +for (var i = 0; i < 10; i++) { + continue; + x = 4; +} +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/continue/output.generated.txt new file mode 100644 index 0000000..cff91da --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue/output.generated.txt @@ -0,0 +1,206 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %18 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %19 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %20 = "jsir.variable_declarator"(%18, %19) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%20) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %15 = "jsir.identifier_ref"() <{name = "i"}> : () -> !jsir.any +// JSLIR-NEXT: %16 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.variable_declarator"(%15, %16) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%17) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "cf.br"()[^bb2] : () -> () +// JSLIR-NEXT: ^bb2: // 2 preds: ^bb1, ^bb5 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %1 = "jsir.identifier"() <{name = "i"}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+01 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.binary_expression"(%1, %2) <{operator_ = "<"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %4 = "builtin.unrealized_conversion_cast"(%3) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%4)[^bb3, ^bb6] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb3: // pred: ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %5 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.continue_statement"() : () -> () +// JSLIR-NEXT: "cf.br"()[^bb5] : () -> () +// JSLIR-NEXT: ^bb4: // no predecessors +// JSLIR-NEXT: %6 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.numeric_literal"() <{extra = #jsir, value = 4.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.assignment_expression"(%6, %7) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%8) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb5] : () -> () +// JSLIR-NEXT: ^bb5: // 2 preds: ^bb3, ^bb4 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %9 = "jsir.identifier_ref"() <{name = "i"}> : () -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.update_expression"(%9) <{operator_ = "++", prefix = false}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expr_region_end"(%10) : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb2] : () -> () +// JSLIR-NEXT: ^bb6: // pred: ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %11 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.member_expression"(%11) <{literal_property = #jsir, , "log", 73, 76, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.call_expression"(%12, %13) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%14) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %18 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSLIR-NEXT: // %19 = 3.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.variable_declarator (%18, %19) +// JSLIR-NEXT: // %20 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%20) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.identifier_ref {"i"} +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %16 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.variable_declarator (%15, %16) +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%17) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.identifier {"i"} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.numeric_literal {#jsir, 1.000000e+01 : f64} +// JSLIR-NEXT: // %2 = 1.000000e+01 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.binary_expression (%1, %2) {"<"} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = builtin.unrealized_conversion_cast (%3) +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%4) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.continue_statement +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb4: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.numeric_literal {#jsir, 4.000000e+00 : f64} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.assignment_expression (%6, %7) {"="} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%8) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb5: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.identifier_ref {"i"} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.update_expression (%9) {"++", false} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expr_region_end (%10) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb6: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.identifier {"console"} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.member_expression (%11) {#jsir, , "log", 73, 76, 0, "log">} +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.identifier {"x"} +// JSLIR-NEXT: // %13 = 3.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.call_expression (%12, %13) +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%14) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/continue/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/README.generated.md new file mode 100644 index 0000000..cc379ec --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/input.js new file mode 100644 index 0000000..9e6cbf9 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/input.js @@ -0,0 +1,6 @@ +var x = 3; +for (var i = 0; i < 10; i++) { + continue; + x = 4; +} +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/output.generated.txt new file mode 100644 index 0000000..9690c73 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/output.generated.txt @@ -0,0 +1,168 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.variable_declarator"(%4, %5) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jshir.for_statement"() ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "i"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.variable_declarator"(%4, %5) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %4 = "jsir.identifier"() <{name = "i"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+01 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.binary_expression"(%4, %5) <{operator_ = "<"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "i"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.update_expression"(%4) <{operator_ = "++", prefix = false}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%5) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: "jshir.continue_statement"() : () -> () +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 4.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.assignment_expression"(%4, %5) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 73, 76, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "x"}> : () -> !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: }, { +// 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: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 3.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.variable_declarator (%4, %5) +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.for_statement ({ +// 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: %4 = jsir.identifier_ref {"i"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 0.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.variable_declarator (%4, %5) +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier {"i"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 1.000000e+01 : f64} +// JSHIR-NEXT: // %5 = 1.000000e+01 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.binary_expression (%4, %5) {"<"} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier_ref {"i"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.update_expression (%4) {"++", false} +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%5) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.continue_statement +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 4.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 4.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.assignment_expression (%4, %5) {"="} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// 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", 73, 76, 0, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"x"} +// JSHIR-NEXT: // %2 = 3.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/continue_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/README.generated.md new file mode 100644 index 0000000..5c2989e --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/do_while/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/input.js new file mode 100644 index 0000000..0e0ded4 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/input.js @@ -0,0 +1,7 @@ +var x = 1; +var y = 1; +do { + x = x + 2; +} while (z); +console.log(x); +console.log(y); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/output.generated.txt new file mode 100644 index 0000000..ec32a3f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/output.generated.txt @@ -0,0 +1,184 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %20 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %21 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %22 = "jsir.variable_declarator"(%20, %21) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%22) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %17 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %18 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %19 = "jsir.variable_declarator"(%17, %18) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%19) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // 2 preds: ^bb0, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %1 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.binary_expression"(%3, %4) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.assignment_expression"(%2, %5) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%6) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb2] : () -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %7 = "jsir.identifier"() <{name = "z"}> : () -> !jsir.any +// JSLIR-NEXT: %8 = "builtin.unrealized_conversion_cast"(%7) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%8)[^bb1, ^bb3] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb3: // pred: ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %9 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.member_expression"(%9) <{literal_property = #jsir, , "log", 61, 64, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.call_expression"(%10, %11) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%12) : (!jsir.any) -> () +// JSLIR-NEXT: %13 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.member_expression"(%13) <{literal_property = #jsir, , "log", 77, 80, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.identifier"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %16 = "jsir.call_expression"(%14, %15) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%16) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %20 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %21 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %21 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %22 = jsir.variable_declarator (%20, %21) +// JSLIR-NEXT: // %22 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%22) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.identifier_ref {"y"} +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %18 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.variable_declarator (%17, %18) +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%19) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.identifier {"x"} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %4 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.binary_expression (%3, %4) {"+"} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.assignment_expression (%2, %5) {"="} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%6) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.identifier {"z"} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = builtin.unrealized_conversion_cast (%7) +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%8) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.identifier {"console"} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.member_expression (%9) {#jsir, , "log", 61, 64, 0, "log">} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.identifier {"x"} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.call_expression (%10, %11) +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%12) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.identifier {"console"} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.member_expression (%13) {#jsir, , "log", 77, 80, 0, "log">} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.identifier {"y"} +// JSLIR-NEXT: // %15 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.call_expression (%14, %15) +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%16) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/README.generated.md new file mode 100644 index 0000000..edc845b --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/input.js new file mode 100644 index 0000000..0e0ded4 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/input.js @@ -0,0 +1,7 @@ +var x = 1; +var y = 1; +do { + x = x + 2; +} while (z); +console.log(x); +console.log(y); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/output.generated.txt new file mode 100644 index 0000000..76c1161 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/output.generated.txt @@ -0,0 +1,163 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %8 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %9 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %10 = "jsir.variable_declarator"(%8, %9) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%10) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %8 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSHIR-NEXT: %9 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %10 = "jsir.variable_declarator"(%8, %9) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%10) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jshir.do_while_statement"() ({ +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %8 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %9 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %10 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %11 = "jsir.binary_expression"(%9, %10) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: %12 = "jsir.assignment_expression"(%8, %11) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%12) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %8 = "jsir.identifier"() <{name = "z"}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%8) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 61, 64, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "x"}> : () -> !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", 77, 80, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.identifier"() <{name = "y"}> : () -> !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: }, { +// 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: %8 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %9 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.variable_declarator (%8, %9) +// JSHIR-NEXT: // %10 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%10) +// 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: %8 = jsir.identifier_ref {"y"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %9 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.variable_declarator (%8, %9) +// JSHIR-NEXT: // %10 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%10) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.do_while_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.identifier {"x"} +// JSHIR-NEXT: // %9 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSHIR-NEXT: // %10 = 2.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %11 = jsir.binary_expression (%9, %10) {"+"} +// JSHIR-NEXT: // %11 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %12 = jsir.assignment_expression (%8, %11) {"="} +// JSHIR-NEXT: // %12 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%12) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier {"z"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%8) +// 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", 61, 64, 0, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"x"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier {"console"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 77, 80, 0, "log">} +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.identifier {"y"} +// JSHIR-NEXT: // %6 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%7) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/do_while_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/for/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/for/README.generated.md new file mode 100644 index 0000000..04f42e1 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/for/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/for/input.js new file mode 100644 index 0000000..e8ba737 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for/input.js @@ -0,0 +1,2 @@ +for (var i = 0; i < 10; i++) + console.log(i); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/for/output.generated.txt new file mode 100644 index 0000000..b5ceef2 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for/output.generated.txt @@ -0,0 +1,145 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: %0 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %11 = "jsir.identifier_ref"() <{name = "i"}> : () -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.variable_declarator"(%11, %12) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%13) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "cf.br"()[^bb2] : () -> () +// JSLIR-NEXT: ^bb2: // 2 preds: ^bb1, ^bb4 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %1 = "jsir.identifier"() <{name = "i"}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+01 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.binary_expression"(%1, %2) <{operator_ = "<"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %4 = "builtin.unrealized_conversion_cast"(%3) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%4)[^bb3, ^bb5] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb3: // pred: ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %5 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.member_expression"(%5) <{literal_property = #jsir, , "log", 39, 42, 1, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.identifier"() <{name = "i"}> : () -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.call_expression"(%6, %7) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%8) : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb4] : () -> () +// JSLIR-NEXT: ^bb4: // pred: ^bb3 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %9 = "jsir.identifier_ref"() <{name = "i"}> : () -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.update_expression"(%9) <{operator_ = "++", prefix = false}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expr_region_end"(%10) : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb2] : () -> () +// JSLIR-NEXT: ^bb5: // pred: ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.identifier_ref {"i"} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %12 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.variable_declarator (%11, %12) +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%13) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.identifier {"i"} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.numeric_literal {#jsir, 1.000000e+01 : f64} +// JSLIR-NEXT: // %2 = 1.000000e+01 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.binary_expression (%1, %2) {"<"} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = builtin.unrealized_conversion_cast (%3) +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%4) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.identifier {"console"} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.member_expression (%5) {#jsir, , "log", 39, 42, 1, "log">} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.identifier {"i"} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.call_expression (%6, %7) +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%8) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb4: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.identifier_ref {"i"} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.update_expression (%9) {"++", false} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expr_region_end (%10) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb5: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/for/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/README.generated.md new file mode 100644 index 0000000..7bb947f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/for_in/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/input.js new file mode 100644 index 0000000..e8eaca4 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/input.js @@ -0,0 +1,7 @@ +var y = 0; +for (var key in object) { + console.log(key); + console.log(object[key]); + y = y + 1; +} +console.log(y); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/output.generated.txt new file mode 100644 index 0000000..75d3af3 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/output.generated.txt @@ -0,0 +1,193 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %25 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %26 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %27 = "jsir.variable_declarator"(%25, %26) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%27) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "key"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.identifier"() <{name = "object"}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jslir.for_in_statement_start"(%0, %1) <{left_declaration = #jsir, , 16, 23, 1, , , 20, 23, 1, "key", 0, "var">}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // 2 preds: ^bb0, ^bb2 +// JSLIR-NEXT: %3 = "jslir.for_in_of_statement_has_next"(%2) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %4 = "builtin.unrealized_conversion_cast"(%3) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%4)[^bb2, ^bb3] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb1 +// JSLIR-NEXT: "jslir.for_in_of_statement_get_next"(%2) : (!jsir.any) -> () +// JSLIR-NEXT: %5 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %6 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.member_expression"(%6) <{literal_property = #jsir, , "log", 47, 50, 2, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.identifier"() <{name = "key"}> : () -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.call_expression"(%7, %8) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%9) : (!jsir.any) -> () +// JSLIR-NEXT: %10 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.member_expression"(%10) <{literal_property = #jsir, , "log", 67, 70, 2, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.identifier"() <{name = "object"}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.identifier"() <{name = "key"}> : () -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.member_expression"(%12, %13) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.call_expression"(%11, %14) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%15) : (!jsir.any) -> () +// JSLIR-NEXT: %16 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.identifier"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %18 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %19 = "jsir.binary_expression"(%17, %18) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %20 = "jsir.assignment_expression"(%16, %19) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%20) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb3: // pred: ^bb1 +// JSLIR-NEXT: "jslir.for_in_of_statement_end"(%2) : (!jsir.any) -> () +// JSLIR-NEXT: %21 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %22 = "jsir.member_expression"(%21) <{literal_property = #jsir, , "log", 108, 111, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %23 = "jsir.identifier"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %24 = "jsir.call_expression"(%22, %23) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%24) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %25 = jsir.identifier_ref {"y"} +// JSLIR-NEXT: // %25 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %26 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %26 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %27 = jsir.variable_declarator (%25, %26) +// JSLIR-NEXT: // %27 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%27) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier_ref {"key"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.identifier {"object"} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jslir.for_in_statement_start (%0, %1) {#jsir, , 16, 23, 1, , , 20, 23, 1, "key", 0, "var">} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jslir.for_in_of_statement_has_next (%2) +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = builtin.unrealized_conversion_cast (%3) +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%4) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.for_in_of_statement_get_next (%2) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.identifier {"console"} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.member_expression (%6) {#jsir, , "log", 47, 50, 2, "log">} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.identifier {"key"} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.call_expression (%7, %8) +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%9) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.identifier {"console"} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.member_expression (%10) {#jsir, , "log", 67, 70, 2, "log">} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.identifier {"object"} +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.identifier {"key"} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.member_expression (%12, %13) +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.call_expression (%11, %14) +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%15) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.identifier_ref {"y"} +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.identifier {"y"} +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %18 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.binary_expression (%17, %18) {"+"} +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.assignment_expression (%16, %19) {"="} +// JSLIR-NEXT: // %20 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%20) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.for_in_of_statement_end (%2) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %21 = jsir.identifier {"console"} +// JSLIR-NEXT: // %21 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %22 = jsir.member_expression (%21) {#jsir, , "log", 108, 111, 0, "log">} +// JSLIR-NEXT: // %22 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %23 = jsir.identifier {"y"} +// JSLIR-NEXT: // %23 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %24 = jsir.call_expression (%22, %23) +// JSLIR-NEXT: // %24 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%24) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/README.generated.md new file mode 100644 index 0000000..3cc9abe --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/input.js new file mode 100644 index 0000000..e8eaca4 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/input.js @@ -0,0 +1,7 @@ +var y = 0; +for (var key in object) { + console.log(key); + console.log(object[key]); + y = y + 1; +} +console.log(y); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/output.generated.txt new file mode 100644 index 0000000..04dfebf --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/output.generated.txt @@ -0,0 +1,163 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %6 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSHIR-NEXT: %7 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %8 = "jsir.variable_declarator"(%6, %7) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%8) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "key"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.identifier"() <{name = "object"}> : () -> !jsir.any +// JSHIR-NEXT: "jshir.for_in_statement"(%0, %1) <{left_declaration = #jsir, , 16, 23, 1, , , 20, 23, 1, "key", 0, "var">}> ({ +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %6 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %7 = "jsir.member_expression"(%6) <{literal_property = #jsir, , "log", 47, 50, 2, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %8 = "jsir.identifier"() <{name = "key"}> : () -> !jsir.any +// JSHIR-NEXT: %9 = "jsir.call_expression"(%7, %8) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%9) : (!jsir.any) -> () +// JSHIR-NEXT: %10 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %11 = "jsir.member_expression"(%10) <{literal_property = #jsir, , "log", 67, 70, 2, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %12 = "jsir.identifier"() <{name = "object"}> : () -> !jsir.any +// JSHIR-NEXT: %13 = "jsir.identifier"() <{name = "key"}> : () -> !jsir.any +// JSHIR-NEXT: %14 = "jsir.member_expression"(%12, %13) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: %15 = "jsir.call_expression"(%11, %14) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%15) : (!jsir.any) -> () +// JSHIR-NEXT: %16 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSHIR-NEXT: %17 = "jsir.identifier"() <{name = "y"}> : () -> !jsir.any +// JSHIR-NEXT: %18 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %19 = "jsir.binary_expression"(%17, %18) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: %20 = "jsir.assignment_expression"(%16, %19) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%20) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : (!jsir.any, !jsir.any) -> () +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %3 = "jsir.member_expression"(%2) <{literal_property = #jsir, , "log", 108, 111, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %4 = "jsir.identifier"() <{name = "y"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.call_expression"(%3, %4) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%5) : (!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: %6 = jsir.identifier_ref {"y"} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSHIR-NEXT: // %7 = 0.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.variable_declarator (%6, %7) +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%8) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %0 = jsir.identifier_ref {"key"} +// JSHIR-NEXT: // %0 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %1 = jsir.identifier {"object"} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.for_in_statement (%0, %1) {#jsir, , 16, 23, 1, , , 20, 23, 1, "key", 0, "var">} ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.identifier {"console"} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.member_expression (%6) {#jsir, , "log", 47, 50, 2, "log">} +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier {"key"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.call_expression (%7, %8) +// JSHIR-NEXT: // %9 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%9) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.identifier {"console"} +// JSHIR-NEXT: // %10 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %11 = jsir.member_expression (%10) {#jsir, , "log", 67, 70, 2, "log">} +// JSHIR-NEXT: // %11 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %12 = jsir.identifier {"object"} +// JSHIR-NEXT: // %12 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %13 = jsir.identifier {"key"} +// JSHIR-NEXT: // %13 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %14 = jsir.member_expression (%12, %13) +// JSHIR-NEXT: // %14 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %15 = jsir.call_expression (%11, %14) +// JSHIR-NEXT: // %15 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%15) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %16 = jsir.identifier_ref {"y"} +// JSHIR-NEXT: // %16 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %17 = jsir.identifier {"y"} +// JSHIR-NEXT: // %17 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %18 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %18 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %19 = jsir.binary_expression (%17, %18) {"+"} +// JSHIR-NEXT: // %19 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %20 = jsir.assignment_expression (%16, %19) {"="} +// JSHIR-NEXT: // %20 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%20) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"console"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.member_expression (%2) {#jsir, , "log", 108, 111, 0, "log">} +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier {"y"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.call_expression (%3, %4) +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%5) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_in_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/README.generated.md new file mode 100644 index 0000000..c0e29a8 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/input.js new file mode 100644 index 0000000..e8ba737 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/input.js @@ -0,0 +1,2 @@ +for (var i = 0; i < 10; i++) + console.log(i); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/output.generated.txt new file mode 100644 index 0000000..3969dc6 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/output.generated.txt @@ -0,0 +1,113 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jshir.for_statement"() ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "i"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.variable_declarator"(%0, %1) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%2) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "i"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+01 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.binary_expression"(%0, %1) <{operator_ = "<"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%2) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "i"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.update_expression"(%0) <{operator_ = "++", prefix = false}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%1) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 39, 42, 1, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "i"}> : () -> !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: }) : () -> () +// 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: jshir.for_statement ({ +// 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: %0 = jsir.identifier_ref {"i"} +// JSHIR-NEXT: // %0 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %1 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSHIR-NEXT: // %1 = 0.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.variable_declarator (%0, %1) +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%2) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %0 = jsir.identifier {"i"} +// JSHIR-NEXT: // %0 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %1 = jsir.numeric_literal {#jsir, 1.000000e+01 : f64} +// JSHIR-NEXT: // %1 = 1.000000e+01 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.binary_expression (%0, %1) {"<"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%2) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %0 = jsir.identifier_ref {"i"} +// JSHIR-NEXT: // %0 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %1 = jsir.update_expression (%0) {"++", false} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%1) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// 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", 39, 42, 1, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"i"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/README.generated.md new file mode 100644 index 0000000..01f8dd2 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/for_of/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/input.js new file mode 100644 index 0000000..7cc07ed --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/input.js @@ -0,0 +1,6 @@ +var y = 0; +for (var x of array) { + console.log(x); + y = y + 1; +} +console.log(y); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/output.generated.txt new file mode 100644 index 0000000..f5b2638 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/output.generated.txt @@ -0,0 +1,166 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %19 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %20 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %21 = "jsir.variable_declarator"(%19, %20) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%21) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.identifier"() <{name = "array"}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jslir.for_of_statement_start"(%0, %1) <{await = false, left_declaration = #jsir, , 16, 21, 1, , , 20, 21, 1, "x", 0, "var">}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // 2 preds: ^bb0, ^bb2 +// JSLIR-NEXT: %3 = "jslir.for_in_of_statement_has_next"(%2) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %4 = "builtin.unrealized_conversion_cast"(%3) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%4)[^bb2, ^bb3] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb1 +// JSLIR-NEXT: "jslir.for_in_of_statement_get_next"(%2) : (!jsir.any) -> () +// JSLIR-NEXT: %5 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %6 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.member_expression"(%6) <{literal_property = #jsir, , "log", 44, 47, 2, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.call_expression"(%7, %8) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%9) : (!jsir.any) -> () +// JSLIR-NEXT: %10 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.identifier"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.binary_expression"(%11, %12) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.assignment_expression"(%10, %13) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%14) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb3: // pred: ^bb1 +// JSLIR-NEXT: "jslir.for_in_of_statement_end"(%2) : (!jsir.any) -> () +// JSLIR-NEXT: %15 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %16 = "jsir.member_expression"(%15) <{literal_property = #jsir, , "log", 75, 78, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.identifier"() <{name = "y"}> : () -> !jsir.any +// JSLIR-NEXT: %18 = "jsir.call_expression"(%16, %17) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%18) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.identifier_ref {"y"} +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %20 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %21 = jsir.variable_declarator (%19, %20) +// JSLIR-NEXT: // %21 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%21) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.identifier {"array"} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jslir.for_of_statement_start (%0, %1) {false, #jsir, , 16, 21, 1, , , 20, 21, 1, "x", 0, "var">} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jslir.for_in_of_statement_has_next (%2) +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = builtin.unrealized_conversion_cast (%3) +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%4) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.for_in_of_statement_get_next (%2) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.identifier {"console"} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.member_expression (%6) {#jsir, , "log", 44, 47, 2, "log">} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.identifier {"x"} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.call_expression (%7, %8) +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%9) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.identifier_ref {"y"} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.identifier {"y"} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %12 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.binary_expression (%11, %12) {"+"} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.assignment_expression (%10, %13) {"="} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%14) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.for_in_of_statement_end (%2) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.identifier {"console"} +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.member_expression (%15) {#jsir, , "log", 75, 78, 0, "log">} +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.identifier {"y"} +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.call_expression (%16, %17) +// JSLIR-NEXT: // %18 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%18) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/README.generated.md new file mode 100644 index 0000000..5c4ebdd --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/input.js new file mode 100644 index 0000000..7cc07ed --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/input.js @@ -0,0 +1,6 @@ +var y = 0; +for (var x of array) { + console.log(x); + y = y + 1; +} +console.log(y); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/output.generated.txt new file mode 100644 index 0000000..a73716d --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/output.generated.txt @@ -0,0 +1,136 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %6 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSHIR-NEXT: %7 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %8 = "jsir.variable_declarator"(%6, %7) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%8) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.identifier"() <{name = "array"}> : () -> !jsir.any +// JSHIR-NEXT: "jshir.for_of_statement"(%0, %1) <{await = false, left_declaration = #jsir, , 16, 21, 1, , , 20, 21, 1, "x", 0, "var">}> ({ +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %6 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %7 = "jsir.member_expression"(%6) <{literal_property = #jsir, , "log", 44, 47, 2, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %8 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %9 = "jsir.call_expression"(%7, %8) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%9) : (!jsir.any) -> () +// JSHIR-NEXT: %10 = "jsir.identifier_ref"() <{name = "y"}> : () -> !jsir.any +// JSHIR-NEXT: %11 = "jsir.identifier"() <{name = "y"}> : () -> !jsir.any +// JSHIR-NEXT: %12 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %13 = "jsir.binary_expression"(%11, %12) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: %14 = "jsir.assignment_expression"(%10, %13) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%14) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : (!jsir.any, !jsir.any) -> () +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %3 = "jsir.member_expression"(%2) <{literal_property = #jsir, , "log", 75, 78, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %4 = "jsir.identifier"() <{name = "y"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.call_expression"(%3, %4) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%5) : (!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: %6 = jsir.identifier_ref {"y"} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSHIR-NEXT: // %7 = 0.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.variable_declarator (%6, %7) +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%8) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %0 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %0 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %1 = jsir.identifier {"array"} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.for_of_statement (%0, %1) {false, #jsir, , 16, 21, 1, , , 20, 21, 1, "x", 0, "var">} ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.identifier {"console"} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.member_expression (%6) {#jsir, , "log", 44, 47, 2, "log">} +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier {"x"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.call_expression (%7, %8) +// JSHIR-NEXT: // %9 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%9) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.identifier_ref {"y"} +// JSHIR-NEXT: // %10 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %11 = jsir.identifier {"y"} +// JSHIR-NEXT: // %11 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %12 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %12 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %13 = jsir.binary_expression (%11, %12) {"+"} +// JSHIR-NEXT: // %13 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %14 = jsir.assignment_expression (%10, %13) {"="} +// JSHIR-NEXT: // %14 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%14) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"console"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.member_expression (%2) {#jsir, , "log", 75, 78, 0, "log">} +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier {"y"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.call_expression (%3, %4) +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%5) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/for_of_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/function/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/function/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/function/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/function/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/function/README.generated.md new file mode 100644 index 0000000..ed7180c --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/function/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/function/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/function/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/function/input.js new file mode 100644 index 0000000..c46e844 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/function/input.js @@ -0,0 +1,5 @@ +function foo(arg) { + var is_a_const = 1; + var not_a_const = arg + 1; + return is_a_const; +} diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/function/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/function/output.generated.txt new file mode 100644 index 0000000..5e7d9a4 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/function/output.generated.txt @@ -0,0 +1,116 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.function_declaration"() <{async = false, generator = false, id = #jsir, , "foo", 9, 12, 1, "foo">}> ({ +// JSLIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "arg"}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%0) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: %0 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "is_a_const"}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.variable_declarator"(%2, %3) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%4) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "not_a_const"}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.identifier"() <{name = "arg"}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.binary_expression"(%3, %4) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.variable_declarator"(%2, %5) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%6) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %1 = "jsir.identifier"() <{name = "is_a_const"}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.return_statement"(%1) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.function_declaration {false, false, #jsir, , "foo", 9, 12, 1, "foo">} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier_ref {"arg"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%0) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.identifier_ref {"is_a_const"} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %3 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.variable_declarator (%2, %3) +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%4) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.identifier_ref {"not_a_const"} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.identifier {"arg"} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %4 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.binary_expression (%3, %4) {"+"} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.variable_declarator (%2, %5) +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%6) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.identifier {"is_a_const"} +// JSLIR-NEXT: // %1 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.return_statement (%1) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/function/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/function/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/function/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/if/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/if/README.generated.md new file mode 100644 index 0000000..1dccd07 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/if/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/if/input.js new file mode 100644 index 0000000..8cb612c --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if/input.js @@ -0,0 +1,4 @@ +if (1 + 1 == 2) + a; +else + b; diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/if/output.generated.txt new file mode 100644 index 0000000..1143227 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if/output.generated.txt @@ -0,0 +1,94 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: %0 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.binary_expression"(%0, %1) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.binary_expression"(%2, %3) <{operator_ = "=="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %5 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: %6 = "builtin.unrealized_conversion_cast"(%4) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%6)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %7 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%7) : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %8 = "jsir.identifier"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%8) : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb3: // 2 preds: ^bb1, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%5) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %0 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %1 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.binary_expression (%0, %1) {"+"} +// JSLIR-NEXT: // %2 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %3 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.binary_expression (%2, %3) {"=="} +// JSLIR-NEXT: // %4 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = builtin.unrealized_conversion_cast (%4) +// JSLIR-NEXT: // %6 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%6) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.identifier {"a"} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%7) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.identifier {"b"} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%8) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%5) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/if/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/README.generated.md new file mode 100644 index 0000000..7cf6448 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/input.js new file mode 100644 index 0000000..18ffce9 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/input.js @@ -0,0 +1,6 @@ +var a; +if (true) + a = 1; +else + a = 2; +a; // Should be 1 diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/output.generated.txt new file mode 100644 index 0000000..841bce8 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/output.generated.txt @@ -0,0 +1,120 @@ +// JSLIR: "jsir.file"() <{comments = [#jsir, , 44, 58, " Should be 1">]}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %10 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.variable_declarator"(%10) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%11) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "builtin.unrealized_conversion_cast"(%0) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%2)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %3 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.assignment_expression"(%3, %4) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%5) : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %6 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.assignment_expression"(%6, %7) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%8) : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb3: // 2 preds: ^bb1, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %9 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%9) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[#jsir, , 44, 58, " Should be 1">]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.variable_declarator (%10) +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%11) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %0 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = builtin.unrealized_conversion_cast (%0) +// JSLIR-NEXT: // %2 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%2) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %4 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.assignment_expression (%3, %4) {"="} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%5) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.assignment_expression (%6, %7) {"="} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%8) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.identifier {"a"} +// JSLIR-NEXT: // %9 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%9) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/README.generated.md new file mode 100644 index 0000000..a470ff2 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/input.js new file mode 100644 index 0000000..18ffce9 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/input.js @@ -0,0 +1,6 @@ +var a; +if (true) + a = 1; +else + a = 2; +a; // Should be 1 diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/output.generated.txt new file mode 100644 index 0000000..d73c8b9 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/output.generated.txt @@ -0,0 +1,95 @@ +// JSHIR: "jsir.file"() <{comments = [#jsir, , 44, 58, " Should be 1">]}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSHIR-NEXT: %3 = "jsir.variable_declarator"(%2) : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%3) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSHIR-NEXT: "jshir.if_statement"(%0) ({ +// JSHIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSHIR-NEXT: %3 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %4 = "jsir.assignment_expression"(%2, %3) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%4) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSHIR-NEXT: %3 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %4 = "jsir.assignment_expression"(%2, %3) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%4) : (!jsir.any) -> () +// JSHIR-NEXT: }) : (!jsir.any) -> () +// JSHIR-NEXT: %1 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%1) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: jsir.file {[#jsir, , 44, 58, " Should be 1">]} ({ +// 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: %2 = jsir.identifier_ref {"a"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.variable_declarator (%2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %0 = jsir.boolean_literal {true} +// JSHIR-NEXT: // %0 = true +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.if_statement (%0) ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier_ref {"a"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %3 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.assignment_expression (%2, %3) {"="} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%4) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier_ref {"a"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.assignment_expression (%2, %3) {"="} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%4) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %1 = jsir.identifier {"a"} +// JSHIR-NEXT: // %1 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%1) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_dead_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/README.generated.md new file mode 100644 index 0000000..dd4f6d1 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/input.js new file mode 100644 index 0000000..7b3bff3 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/input.js @@ -0,0 +1,6 @@ +var a; +if (x) + a = 1; +else + a = 2; +a; // Should be unknown. diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/output.generated.txt new file mode 100644 index 0000000..9a21fed --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/output.generated.txt @@ -0,0 +1,120 @@ +// JSLIR: "jsir.file"() <{comments = [#jsir, , 41, 62, " Should be unknown.">]}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %10 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.variable_declarator"(%10) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%11) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "builtin.unrealized_conversion_cast"(%0) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%2)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %3 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.assignment_expression"(%3, %4) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%5) : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %6 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.assignment_expression"(%6, %7) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%8) : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb3: // 2 preds: ^bb1, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %9 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%9) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[#jsir, , 41, 62, " Should be unknown.">]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.variable_declarator (%10) +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%11) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier {"x"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = builtin.unrealized_conversion_cast (%0) +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%2) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %4 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.assignment_expression (%3, %4) {"="} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%5) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %7 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.assignment_expression (%6, %7) {"="} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%8) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.identifier {"a"} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%9) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/README.generated.md new file mode 100644 index 0000000..86ee626 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/input.js new file mode 100644 index 0000000..7b3bff3 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/input.js @@ -0,0 +1,6 @@ +var a; +if (x) + a = 1; +else + a = 2; +a; // Should be unknown. diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/output.generated.txt new file mode 100644 index 0000000..ea6835b --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/output.generated.txt @@ -0,0 +1,95 @@ +// JSHIR: "jsir.file"() <{comments = [#jsir, , 41, 62, " Should be unknown.">]}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSHIR-NEXT: %3 = "jsir.variable_declarator"(%2) : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%3) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: "jshir.if_statement"(%0) ({ +// JSHIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSHIR-NEXT: %3 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %4 = "jsir.assignment_expression"(%2, %3) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%4) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSHIR-NEXT: %3 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %4 = "jsir.assignment_expression"(%2, %3) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%4) : (!jsir.any) -> () +// JSHIR-NEXT: }) : (!jsir.any) -> () +// JSHIR-NEXT: %1 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%1) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: jsir.file {[#jsir, , 41, 62, " Should be unknown.">]} ({ +// 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: %2 = jsir.identifier_ref {"a"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.variable_declarator (%2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %0 = jsir.identifier {"x"} +// JSHIR-NEXT: // %0 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.if_statement (%0) ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier_ref {"a"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %3 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.assignment_expression (%2, %3) {"="} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%4) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier_ref {"a"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSHIR-NEXT: // %3 = 2.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.assignment_expression (%2, %3) {"="} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%4) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %1 = jsir.identifier {"a"} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%1) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/if_var_unknown_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/label/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/label/README.generated.md new file mode 100644 index 0000000..5070dbf --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/label/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/label/input.js new file mode 100644 index 0000000..566a003 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label/input.js @@ -0,0 +1,9 @@ +var x = 1; +my_label: while (true) { + x = 2; + while (true) { + break my_label; + } + x = 3; +} +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/label/output.generated.txt new file mode 100644 index 0000000..6dcdc75 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label/output.generated.txt @@ -0,0 +1,221 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %19 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %20 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %21 = "jsir.variable_declarator"(%19, %20) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%21) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jslir.labeled_statement_start"() <{label = #jsir, , "my_label", 11, 19, 0, "my_label">}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // 2 preds: ^bb0, ^bb6 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %2 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "builtin.unrealized_conversion_cast"(%2) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%3)[^bb2, ^bb7] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %4 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%4) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%4) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %5 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.assignment_expression"(%5, %6) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%7) : (!jsir.any) -> () +// JSLIR-NEXT: %8 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb3: // 2 preds: ^bb2, ^bb5 +// JSLIR-NEXT: "jslir.control_flow_marker"(%8) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %9 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %10 = "builtin.unrealized_conversion_cast"(%9) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%10)[^bb4, ^bb6] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb4: // pred: ^bb3 +// JSLIR-NEXT: "jslir.control_flow_marker"(%8) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %11 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%11) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%11) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.break_statement"() <{label = #jsir, , "my_label", 72, 80, 4, "my_label">}> : () -> () +// JSLIR-NEXT: "cf.br"()[^bb7] : () -> () +// JSLIR-NEXT: ^bb5: // no predecessors +// JSLIR-NEXT: "jslir.control_flow_marker"(%11) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb6: // pred: ^bb3 +// JSLIR-NEXT: "jslir.control_flow_marker"(%8) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %12 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.assignment_expression"(%12, %13) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%14) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%4) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb7: // 2 preds: ^bb1, ^bb4 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %15 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %16 = "jsir.member_expression"(%15) <{literal_property = #jsir, , "log", 105, 108, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %18 = "jsir.call_expression"(%16, %17) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%18) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %20 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %21 = jsir.variable_declarator (%19, %20) +// JSLIR-NEXT: // %21 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%21) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jslir.labeled_statement_start {#jsir, , "my_label", 11, 19, 0, "my_label">} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %2 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = builtin.unrealized_conversion_cast (%2) +// JSLIR-NEXT: // %3 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%3) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%4) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%4) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %6 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.assignment_expression (%5, %6) {"="} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%7) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%8) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %9 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = builtin.unrealized_conversion_cast (%9) +// JSLIR-NEXT: // %10 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%10) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb4: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%8) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%11) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%11) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.break_statement {#jsir, , "my_label", 72, 80, 4, "my_label">} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb5: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%11) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb6: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%8) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.assignment_expression (%12, %13) {"="} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%14) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%4) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb7: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.identifier {"console"} +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.member_expression (%15) {#jsir, , "log", 105, 108, 0, "log">} +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.identifier {"x"} +// JSLIR-NEXT: // %17 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.call_expression (%16, %17) +// JSLIR-NEXT: // %18 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%18) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/label/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/README.generated.md new file mode 100644 index 0000000..2f14ffc --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/input.js new file mode 100644 index 0000000..566a003 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/input.js @@ -0,0 +1,9 @@ +var x = 1; +my_label: while (true) { + x = 2; + while (true) { + break my_label; + } + x = 3; +} +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/output.generated.txt new file mode 100644 index 0000000..80184a4 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/output.generated.txt @@ -0,0 +1,173 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.variable_declarator"(%4, %5) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jshir.labeled_statement"() <{label = #jsir, , "my_label", 11, 19, 0, "my_label">}> ({ +// JSHIR-NEXT: "jshir.while_statement"() ({ +// JSHIR-NEXT: %4 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%4) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.assignment_expression"(%4, %5) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: "jshir.while_statement"() ({ +// JSHIR-NEXT: %10 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%10) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: "jshir.break_statement"() <{label = #jsir, , "my_label", 72, 80, 4, "my_label">}> : () -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %7 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %8 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %9 = "jsir.assignment_expression"(%7, %8) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%9) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 105, 108, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "x"}> : () -> !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: }, { +// 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: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.variable_declarator (%4, %5) +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.labeled_statement {#jsir, , "my_label", 11, 19, 0, "my_label">} ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.while_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.boolean_literal {true} +// JSHIR-NEXT: // %4 = true +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%4) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 2.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.assignment_expression (%4, %5) {"="} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.while_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.boolean_literal {true} +// JSHIR-NEXT: // %10 = true +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%10) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.break_statement {#jsir, , "my_label", 72, 80, 4, "my_label">} +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSHIR-NEXT: // %8 = 3.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.assignment_expression (%7, %8) {"="} +// JSHIR-NEXT: // %9 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%9) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// 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", 105, 108, 0, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"x"} +// JSHIR-NEXT: // %2 = 2.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/label_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/literal/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/literal/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/literal/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/literal/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/literal/README.generated.md new file mode 100644 index 0000000..10d52b4 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/literal/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/literal/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/literal/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/literal/input.js new file mode 100644 index 0000000..9b88a46 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/literal/input.js @@ -0,0 +1,17 @@ +// regular expression +/1/; + +// null +null + +// string +'a'; + +// boolean +true; + +// number +1; + +// big int +1n; diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/literal/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/literal/output.generated.txt new file mode 100644 index 0000000..afd3aa2 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/literal/output.generated.txt @@ -0,0 +1,64 @@ +// JSLIR: "jsir.file"() <{comments = [#jsir, , 0, 21, " regular expression">, #jsir, , 28, 35, " null">, #jsir, , 42, 51, " string">, #jsir, , 58, 68, " boolean">, #jsir, , 76, 85, " number">, #jsir, , 90, 100, " big int">]}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: %0 = "jsir.reg_exp_literal"() <{extra = #jsir, flags = "", pattern = "1"}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%0) : (!jsir.any) -> () +// JSLIR-NEXT: %1 = "jsir.null_literal"() : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%1) : (!jsir.any) -> () +// JSLIR-NEXT: %2 = "jsir.string_literal"() <{extra = #jsir, value = "a"}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%2) : (!jsir.any) -> () +// JSLIR-NEXT: %3 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%3) : (!jsir.any) -> () +// JSLIR-NEXT: %4 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%4) : (!jsir.any) -> () +// JSLIR-NEXT: %5 = "jsir.big_int_literal"() <{extra = #jsir, value = "1"}> : () -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%5) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[#jsir, , 0, 21, " regular expression">, #jsir, , 28, 35, " null">, #jsir, , 42, 51, " string">, #jsir, , 58, 68, " boolean">, #jsir, , 76, 85, " number">, #jsir, , 90, 100, " big int">]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.reg_exp_literal {#jsir, "", "1"} +// JSLIR-NEXT: // %0 = #jsir +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%0) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.null_literal +// JSLIR-NEXT: // %1 = #jsir.null_literal +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%1) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.string_literal {#jsir, "a"} +// JSLIR-NEXT: // %2 = "a" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%2) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %3 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%3) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %4 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%4) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.big_int_literal {#jsir, "1"} +// JSLIR-NEXT: // %5 = #jsir +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%5) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/literal/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/literal/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/literal/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/README.generated.md new file mode 100644 index 0000000..47731aa --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/input.js new file mode 100644 index 0000000..26ced28 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/input.js @@ -0,0 +1,8 @@ +var a = null ?? "default for a"; +var b = "" ?? "default for b"; +var c = 42 ?? 0; +var d = x ?? "default for d"; +console.log(a); +console.log(b); +console.log(c); +console.log(d); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/output.generated.txt new file mode 100644 index 0000000..79a80be --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/output.generated.txt @@ -0,0 +1,350 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %43 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %44 = "jsir.null_literal"() : () -> !jsir.any +// JSLIR-NEXT: %45 = "jslir.logical_expression_start"(%44) <{operator_ = "??"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %46 = "jsir.null_literal"() : () -> !jsir.any +// JSLIR-NEXT: %47 = "jsir.binary_expression"(%44, %46) <{operator_ = "=="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %48 = "builtin.unrealized_conversion_cast"(%47) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%48, %44)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%45) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %49 = "jsir.string_literal"() <{extra = #jsir, value = "default for a"}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%49)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%50: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%45) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %51 = "jsir.variable_declarator"(%43, %50) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%51) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %34 = "jsir.identifier_ref"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %35 = "jsir.string_literal"() <{extra = #jsir, value = ""}> : () -> !jsir.any +// JSLIR-NEXT: %36 = "jslir.logical_expression_start"(%35) <{operator_ = "??"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %37 = "jsir.null_literal"() : () -> !jsir.any +// JSLIR-NEXT: %38 = "jsir.binary_expression"(%35, %37) <{operator_ = "=="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %39 = "builtin.unrealized_conversion_cast"(%38) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%39, %35)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%36) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %40 = "jsir.string_literal"() <{extra = #jsir, value = "default for b"}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%40)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%41: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%36) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %42 = "jsir.variable_declarator"(%34, %41) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%42) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %25 = "jsir.identifier_ref"() <{name = "c"}> : () -> !jsir.any +// JSLIR-NEXT: %26 = "jsir.numeric_literal"() <{extra = #jsir, value = 4.200000e+01 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %27 = "jslir.logical_expression_start"(%26) <{operator_ = "??"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %28 = "jsir.null_literal"() : () -> !jsir.any +// JSLIR-NEXT: %29 = "jsir.binary_expression"(%26, %28) <{operator_ = "=="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %30 = "builtin.unrealized_conversion_cast"(%29) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%30, %26)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%27) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %31 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%31)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%32: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%27) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %33 = "jsir.variable_declarator"(%25, %32) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%33) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %16 = "jsir.identifier_ref"() <{name = "d"}> : () -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %18 = "jslir.logical_expression_start"(%17) <{operator_ = "??"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %19 = "jsir.null_literal"() : () -> !jsir.any +// JSLIR-NEXT: %20 = "jsir.binary_expression"(%17, %19) <{operator_ = "=="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %21 = "builtin.unrealized_conversion_cast"(%20) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%21, %17)[^bb1, ^bb2] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%18) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %22 = "jsir.string_literal"() <{extra = #jsir, value = "default for d"}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%22)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%23: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%18) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %24 = "jsir.variable_declarator"(%16, %23) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%24) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 119, 122, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.call_expression"(%1, %2) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%3) : (!jsir.any) -> () +// JSLIR-NEXT: %4 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.member_expression"(%4) <{literal_property = #jsir, , "log", 135, 138, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.identifier"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.call_expression"(%5, %6) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%7) : (!jsir.any) -> () +// JSLIR-NEXT: %8 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.member_expression"(%8) <{literal_property = #jsir, , "log", 151, 154, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.identifier"() <{name = "c"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.call_expression"(%9, %10) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%11) : (!jsir.any) -> () +// JSLIR-NEXT: %12 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.member_expression"(%12) <{literal_property = #jsir, , "log", 167, 170, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.identifier"() <{name = "d"}> : () -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.call_expression"(%13, %14) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%15) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %43 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %43 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %44 = jsir.null_literal +// JSLIR-NEXT: // %44 = #jsir.null_literal +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %45 = jslir.logical_expression_start (%44) {"??"} +// JSLIR-NEXT: // %45 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %46 = jsir.null_literal +// JSLIR-NEXT: // %46 = #jsir.null_literal +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %47 = jsir.binary_expression (%44, %46) {"=="} +// JSLIR-NEXT: // %47 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %48 = builtin.unrealized_conversion_cast (%47) +// JSLIR-NEXT: // %48 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%48, %44) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%45) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %49 = jsir.string_literal {#jsir, "default for a"} +// JSLIR-NEXT: // %49 = "default for a" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%49) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%45) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %51 = jsir.variable_declarator (%43, %50) +// JSLIR-NEXT: // %51 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%51) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %34 = jsir.identifier_ref {"b"} +// JSLIR-NEXT: // %34 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %35 = jsir.string_literal {#jsir, ""} +// JSLIR-NEXT: // %35 = "" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %36 = jslir.logical_expression_start (%35) {"??"} +// JSLIR-NEXT: // %36 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %37 = jsir.null_literal +// JSLIR-NEXT: // %37 = #jsir.null_literal +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %38 = jsir.binary_expression (%35, %37) {"=="} +// JSLIR-NEXT: // %38 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %39 = builtin.unrealized_conversion_cast (%38) +// JSLIR-NEXT: // %39 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%39, %35) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%36) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %40 = jsir.string_literal {#jsir, "default for b"} +// JSLIR-NEXT: // %40 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%40) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%36) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %42 = jsir.variable_declarator (%34, %41) +// JSLIR-NEXT: // %42 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%42) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %25 = jsir.identifier_ref {"c"} +// JSLIR-NEXT: // %25 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %26 = jsir.numeric_literal {#jsir, 4.200000e+01 : f64} +// JSLIR-NEXT: // %26 = 4.200000e+01 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %27 = jslir.logical_expression_start (%26) {"??"} +// JSLIR-NEXT: // %27 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %28 = jsir.null_literal +// JSLIR-NEXT: // %28 = #jsir.null_literal +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %29 = jsir.binary_expression (%26, %28) {"=="} +// JSLIR-NEXT: // %29 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %30 = builtin.unrealized_conversion_cast (%29) +// JSLIR-NEXT: // %30 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%30, %26) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%27) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %31 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %31 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%31) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%27) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %33 = jsir.variable_declarator (%25, %32) +// JSLIR-NEXT: // %33 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%33) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.identifier_ref {"d"} +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.identifier {"x"} +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jslir.logical_expression_start (%17) {"??"} +// JSLIR-NEXT: // %18 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.null_literal +// JSLIR-NEXT: // %19 = #jsir.null_literal +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.binary_expression (%17, %19) {"=="} +// JSLIR-NEXT: // %20 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %21 = builtin.unrealized_conversion_cast (%20) +// JSLIR-NEXT: // %21 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%21, %17) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%18) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %22 = jsir.string_literal {#jsir, "default for d"} +// JSLIR-NEXT: // %22 = "default for d" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%22) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%18) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %24 = jsir.variable_declarator (%16, %23) +// JSLIR-NEXT: // %24 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%24) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier {"console"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.member_expression (%0) {#jsir, , "log", 119, 122, 0, "log">} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.identifier {"a"} +// JSLIR-NEXT: // %2 = "default for a" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%3) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.identifier {"console"} +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 135, 138, 0, "log">} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.identifier {"b"} +// JSLIR-NEXT: // %6 = "" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%7) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.identifier {"console"} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.member_expression (%8) {#jsir, , "log", 151, 154, 0, "log">} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.identifier {"c"} +// JSLIR-NEXT: // %10 = 4.200000e+01 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.call_expression (%9, %10) +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%11) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.identifier {"console"} +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.member_expression (%12) {#jsir, , "log", 167, 170, 0, "log">} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.identifier {"d"} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.call_expression (%13, %14) +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%15) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/README.generated.md new file mode 100644 index 0000000..2616e44 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/input.js new file mode 100644 index 0000000..26ced28 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/input.js @@ -0,0 +1,8 @@ +var a = null ?? "default for a"; +var b = "" ?? "default for b"; +var c = 42 ?? 0; +var d = x ?? "default for d"; +console.log(a); +console.log(b); +console.log(c); +console.log(d); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/output.generated.txt new file mode 100644 index 0000000..b8d60e6 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/output.generated.txt @@ -0,0 +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.null_literal"() : () -> !jsir.any +// JSHIR-NEXT: %18 = "jshir.logical_expression"(%17) <{operator_ = "??"}> ({ +// JSHIR-NEXT: %20 = "jsir.string_literal"() <{extra = #jsir, value = "default for a"}> : () -> !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.string_literal"() <{extra = #jsir, value = ""}> : () -> !jsir.any +// JSHIR-NEXT: %18 = "jshir.logical_expression"(%17) <{operator_ = "??"}> ({ +// JSHIR-NEXT: %20 = "jsir.string_literal"() <{extra = #jsir, value = "default for b"}> : () -> !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.numeric_literal"() <{extra = #jsir, value = 4.200000e+01 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %18 = "jshir.logical_expression"(%17) <{operator_ = "??"}> ({ +// JSHIR-NEXT: %20 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !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.string_literal"() <{extra = #jsir, value = "default for d"}> : () -> !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", 119, 122, 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", 135, 138, 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", 151, 154, 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", 167, 170, 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.null_literal +// JSHIR-NEXT: // %17 = #jsir.null_literal +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %18 = jshir.logical_expression (%17) {"??"} ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %20 = jsir.string_literal {#jsir, "default for a"} +// JSHIR-NEXT: // %20 = "default for a" +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%20) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // %18 = "default for a" +// 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.string_literal {#jsir, ""} +// 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.string_literal {#jsir, "default for b"} +// JSHIR-NEXT: // %20 = +// 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 {"c"} +// JSHIR-NEXT: // %16 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %17 = jsir.numeric_literal {#jsir, 4.200000e+01 : f64} +// JSHIR-NEXT: // %17 = 4.200000e+01 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %18 = jshir.logical_expression (%17) {"??"} ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %20 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSHIR-NEXT: // %20 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%20) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // %18 = 4.200000e+01 : f64 +// 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.string_literal {#jsir, "default for d"} +// JSHIR-NEXT: // %20 = "default for d" +// 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", 119, 122, 0, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"a"} +// JSHIR-NEXT: // %2 = "default for a" +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier {"console"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 135, 138, 0, "log">} +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.identifier {"b"} +// JSHIR-NEXT: // %6 = "" +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%7) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier {"console"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.member_expression (%8) {#jsir, , "log", 151, 154, 0, "log">} +// JSHIR-NEXT: // %9 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.identifier {"c"} +// JSHIR-NEXT: // %10 = 4.200000e+01 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %11 = jsir.call_expression (%9, %10) +// JSHIR-NEXT: // %11 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%11) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %12 = jsir.identifier {"console"} +// JSHIR-NEXT: // %12 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %13 = jsir.member_expression (%12) {#jsir, , "log", 167, 170, 0, "log">} +// JSHIR-NEXT: // %13 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %14 = jsir.identifier {"d"} +// JSHIR-NEXT: // %14 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %15 = jsir.call_expression (%13, %14) +// JSHIR-NEXT: // %15 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%15) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/nullish_coalesce_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/README.generated.md new file mode 100644 index 0000000..deb4795 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/input.js new file mode 100644 index 0000000..c6cb14f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/input.js @@ -0,0 +1,9 @@ +(false+'')[true+true+true] // s ++ +'h' ++ +(!false+'')[!0+!0+!0] // e ++ +(false+'')[!0+!0] // l ++ +(false+'')[!0+!0] // l diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/output.generated.txt new file mode 100644 index 0000000..c16fa06 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/output.generated.txt @@ -0,0 +1,221 @@ +// JSLIR: "jsir.file"() <{comments = [#jsir, , 27, 31, " s">, #jsir, , 62, 66, " e">, #jsir, , 87, 91, " l">, #jsir, , 112, 116, " l">]}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: %0 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.string_literal"() <{extra = #jsir, value = ""}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.binary_expression"(%0, %1) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.parenthesized_expression"(%2) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.binary_expression"(%4, %5) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.binary_expression"(%6, %7) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.member_expression"(%3, %8) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.string_literal"() <{extra = #jsir, value = "h"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.binary_expression"(%9, %10) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.unary_expression"(%12) <{operator_ = "!", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.string_literal"() <{extra = #jsir, value = ""}> : () -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.binary_expression"(%13, %14) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %16 = "jsir.parenthesized_expression"(%15) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %18 = "jsir.unary_expression"(%17) <{operator_ = "!", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %19 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %20 = "jsir.unary_expression"(%19) <{operator_ = "!", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %21 = "jsir.binary_expression"(%18, %20) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %22 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %23 = "jsir.unary_expression"(%22) <{operator_ = "!", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %24 = "jsir.binary_expression"(%21, %23) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %25 = "jsir.member_expression"(%16, %24) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %26 = "jsir.binary_expression"(%11, %25) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %27 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: %28 = "jsir.string_literal"() <{extra = #jsir, value = ""}> : () -> !jsir.any +// JSLIR-NEXT: %29 = "jsir.binary_expression"(%27, %28) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %30 = "jsir.parenthesized_expression"(%29) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %31 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %32 = "jsir.unary_expression"(%31) <{operator_ = "!", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %33 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %34 = "jsir.unary_expression"(%33) <{operator_ = "!", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %35 = "jsir.binary_expression"(%32, %34) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %36 = "jsir.member_expression"(%30, %35) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %37 = "jsir.binary_expression"(%26, %36) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %38 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: %39 = "jsir.string_literal"() <{extra = #jsir, value = ""}> : () -> !jsir.any +// JSLIR-NEXT: %40 = "jsir.binary_expression"(%38, %39) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %41 = "jsir.parenthesized_expression"(%40) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %42 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %43 = "jsir.unary_expression"(%42) <{operator_ = "!", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %44 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %45 = "jsir.unary_expression"(%44) <{operator_ = "!", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %46 = "jsir.binary_expression"(%43, %45) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %47 = "jsir.member_expression"(%41, %46) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %48 = "jsir.binary_expression"(%37, %47) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%48) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[#jsir, , 27, 31, " s">, #jsir, , 62, 66, " e">, #jsir, , 87, 91, " l">, #jsir, , 112, 116, " l">]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %0 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.string_literal {#jsir, ""} +// JSLIR-NEXT: // %1 = "" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.binary_expression (%0, %1) {"+"} +// JSLIR-NEXT: // %2 = "false" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.parenthesized_expression (%2) +// JSLIR-NEXT: // %3 = "false" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %4 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %5 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.binary_expression (%4, %5) {"+"} +// JSLIR-NEXT: // %6 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %7 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.binary_expression (%6, %7) {"+"} +// JSLIR-NEXT: // %8 = 3.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.member_expression (%3, %8) +// JSLIR-NEXT: // %9 = "s" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.string_literal {#jsir, "h"} +// JSLIR-NEXT: // %10 = "h" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.binary_expression (%9, %10) {"+"} +// JSLIR-NEXT: // %11 = "sh" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %12 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.unary_expression (%12) {"!", true} +// JSLIR-NEXT: // %13 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.string_literal {#jsir, ""} +// JSLIR-NEXT: // %14 = "" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.binary_expression (%13, %14) {"+"} +// JSLIR-NEXT: // %15 = "true" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.parenthesized_expression (%15) +// JSLIR-NEXT: // %16 = "true" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %17 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.unary_expression (%17) {"!", true} +// JSLIR-NEXT: // %18 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %19 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.unary_expression (%19) {"!", true} +// JSLIR-NEXT: // %20 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %21 = jsir.binary_expression (%18, %20) {"+"} +// JSLIR-NEXT: // %21 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %22 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %22 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %23 = jsir.unary_expression (%22) {"!", true} +// JSLIR-NEXT: // %23 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %24 = jsir.binary_expression (%21, %23) {"+"} +// JSLIR-NEXT: // %24 = 3.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %25 = jsir.member_expression (%16, %24) +// JSLIR-NEXT: // %25 = "e" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %26 = jsir.binary_expression (%11, %25) {"+"} +// JSLIR-NEXT: // %26 = "she" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %27 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %27 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %28 = jsir.string_literal {#jsir, ""} +// JSLIR-NEXT: // %28 = "" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %29 = jsir.binary_expression (%27, %28) {"+"} +// JSLIR-NEXT: // %29 = "false" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %30 = jsir.parenthesized_expression (%29) +// JSLIR-NEXT: // %30 = "false" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %31 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %31 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %32 = jsir.unary_expression (%31) {"!", true} +// JSLIR-NEXT: // %32 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %33 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %33 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %34 = jsir.unary_expression (%33) {"!", true} +// JSLIR-NEXT: // %34 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %35 = jsir.binary_expression (%32, %34) {"+"} +// JSLIR-NEXT: // %35 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %36 = jsir.member_expression (%30, %35) +// JSLIR-NEXT: // %36 = "l" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %37 = jsir.binary_expression (%26, %36) {"+"} +// JSLIR-NEXT: // %37 = "shel" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %38 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %38 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %39 = jsir.string_literal {#jsir, ""} +// JSLIR-NEXT: // %39 = "" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %40 = jsir.binary_expression (%38, %39) {"+"} +// JSLIR-NEXT: // %40 = "false" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %41 = jsir.parenthesized_expression (%40) +// JSLIR-NEXT: // %41 = "false" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %42 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %42 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %43 = jsir.unary_expression (%42) {"!", true} +// JSLIR-NEXT: // %43 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %44 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %44 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %45 = jsir.unary_expression (%44) {"!", true} +// JSLIR-NEXT: // %45 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %46 = jsir.binary_expression (%43, %45) {"+"} +// JSLIR-NEXT: // %46 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %47 = jsir.member_expression (%41, %46) +// JSLIR-NEXT: // %47 = "l" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %48 = jsir.binary_expression (%37, %47) {"+"} +// JSLIR-NEXT: // %48 = "shell" +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%48) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/obfuscated/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/or/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/or/README.generated.md new file mode 100644 index 0000000..a6cb2cc --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/or/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/or/input.js new file mode 100644 index 0000000..a7b6767 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or/input.js @@ -0,0 +1,8 @@ +var a = true || true; +var b = false || false; +var c = x || true; +var d = x || false; +console.log(a); +console.log(b); +console.log(c); +console.log(d); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/or/output.generated.txt new file mode 100644 index 0000000..197e1aa --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or/output.generated.txt @@ -0,0 +1,318 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %37 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %38 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: %39 = "jslir.logical_expression_start"(%38) <{operator_ = "||"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %40 = "builtin.unrealized_conversion_cast"(%38) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%40, %38)[^bb2, ^bb1] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%39) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %41 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%41)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%42: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%39) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %43 = "jsir.variable_declarator"(%37, %42) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%43) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %30 = "jsir.identifier_ref"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %31 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: %32 = "jslir.logical_expression_start"(%31) <{operator_ = "||"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %33 = "builtin.unrealized_conversion_cast"(%31) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%33, %31)[^bb2, ^bb1] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%32) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %34 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%34)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%35: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%32) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %36 = "jsir.variable_declarator"(%30, %35) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%36) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %23 = "jsir.identifier_ref"() <{name = "c"}> : () -> !jsir.any +// JSLIR-NEXT: %24 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %25 = "jslir.logical_expression_start"(%24) <{operator_ = "||"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %26 = "builtin.unrealized_conversion_cast"(%24) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%26, %24)[^bb2, ^bb1] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%25) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %27 = "jsir.boolean_literal"() <{value = true}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%27)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%28: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%25) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %29 = "jsir.variable_declarator"(%23, %28) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%29) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %16 = "jsir.identifier_ref"() <{name = "d"}> : () -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %18 = "jslir.logical_expression_start"(%17) <{operator_ = "||"}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %19 = "builtin.unrealized_conversion_cast"(%17) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%19, %17)[^bb2, ^bb1] <{operandSegmentSizes = array}> : (i1, !jsir.any) -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%18) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %20 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"(%20)[^bb2] : (!jsir.any) -> () +// JSLIR-NEXT: ^bb2(%21: !jsir.any): // 2 preds: ^bb0, ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%18) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %22 = "jsir.variable_declarator"(%16, %21) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%22) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 93, 96, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.call_expression"(%1, %2) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%3) : (!jsir.any) -> () +// JSLIR-NEXT: %4 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.member_expression"(%4) <{literal_property = #jsir, , "log", 109, 112, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.identifier"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.call_expression"(%5, %6) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%7) : (!jsir.any) -> () +// JSLIR-NEXT: %8 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.member_expression"(%8) <{literal_property = #jsir, , "log", 125, 128, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.identifier"() <{name = "c"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.call_expression"(%9, %10) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%11) : (!jsir.any) -> () +// JSLIR-NEXT: %12 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.member_expression"(%12) <{literal_property = #jsir, , "log", 141, 144, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.identifier"() <{name = "d"}> : () -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.call_expression"(%13, %14) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%15) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %37 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %37 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %38 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %38 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %39 = jslir.logical_expression_start (%38) {"||"} +// JSLIR-NEXT: // %39 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %40 = builtin.unrealized_conversion_cast (%38) +// JSLIR-NEXT: // %40 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%40, %38) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%39) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %41 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %41 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%41) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%39) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %43 = jsir.variable_declarator (%37, %42) +// JSLIR-NEXT: // %43 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%43) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %30 = jsir.identifier_ref {"b"} +// JSLIR-NEXT: // %30 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %31 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %31 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %32 = jslir.logical_expression_start (%31) {"||"} +// JSLIR-NEXT: // %32 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %33 = builtin.unrealized_conversion_cast (%31) +// JSLIR-NEXT: // %33 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%33, %31) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%32) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %34 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %34 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%34) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%32) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %36 = jsir.variable_declarator (%30, %35) +// JSLIR-NEXT: // %36 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%36) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %23 = jsir.identifier_ref {"c"} +// JSLIR-NEXT: // %23 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %24 = jsir.identifier {"x"} +// JSLIR-NEXT: // %24 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %25 = jslir.logical_expression_start (%24) {"||"} +// JSLIR-NEXT: // %25 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %26 = builtin.unrealized_conversion_cast (%24) +// JSLIR-NEXT: // %26 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%26, %24) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%25) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %27 = jsir.boolean_literal {true} +// JSLIR-NEXT: // %27 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%27) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%25) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %29 = jsir.variable_declarator (%23, %28) +// JSLIR-NEXT: // %29 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%29) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.identifier_ref {"d"} +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.identifier {"x"} +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jslir.logical_expression_start (%17) {"||"} +// JSLIR-NEXT: // %18 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = builtin.unrealized_conversion_cast (%17) +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%19, %17) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%18) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.boolean_literal {false} +// JSLIR-NEXT: // %20 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br (%20) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%18) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %22 = jsir.variable_declarator (%16, %21) +// JSLIR-NEXT: // %22 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%22) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier {"console"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.member_expression (%0) {#jsir, , "log", 93, 96, 0, "log">} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.identifier {"a"} +// JSLIR-NEXT: // %2 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%3) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.identifier {"console"} +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 109, 112, 0, "log">} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.identifier {"b"} +// JSLIR-NEXT: // %6 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%7) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.identifier {"console"} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.member_expression (%8) {#jsir, , "log", 125, 128, 0, "log">} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.identifier {"c"} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.call_expression (%9, %10) +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%11) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.identifier {"console"} +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.member_expression (%12) {#jsir, , "log", 141, 144, 0, "log">} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.identifier {"d"} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.call_expression (%13, %14) +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%15) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/or/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/README.generated.md new file mode 100644 index 0000000..a72348b --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/input.js new file mode 100644 index 0000000..a7b6767 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/input.js @@ -0,0 +1,8 @@ +var a = true || true; +var b = false || false; +var c = x || true; +var d = x || false; +console.log(a); +console.log(b); +console.log(c); +console.log(d); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/output.generated.txt new file mode 100644 index 0000000..894e0b7 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/output.generated.txt @@ -0,0 +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 = true}> : () -> !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 = false}> : () -> !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 {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 {true} +// JSHIR-NEXT: // %20 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%20) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // %18 = true +// 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 {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 {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 = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"a"} +// JSHIR-NEXT: // %2 = true +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier {"console"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 109, 112, 0, "log">} +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.identifier {"b"} +// JSHIR-NEXT: // %6 = false +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%7) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier {"console"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.member_expression (%8) {#jsir, , "log", 125, 128, 0, "log">} +// JSHIR-NEXT: // %9 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.identifier {"c"} +// JSHIR-NEXT: // %10 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %11 = jsir.call_expression (%9, %10) +// JSHIR-NEXT: // %11 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%11) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %12 = jsir.identifier {"console"} +// JSHIR-NEXT: // %12 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %13 = jsir.member_expression (%12) {#jsir, , "log", 141, 144, 0, "log">} +// JSHIR-NEXT: // %13 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %14 = jsir.identifier {"d"} +// JSHIR-NEXT: // %14 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %15 = jsir.call_expression (%13, %14) +// JSHIR-NEXT: // %15 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%15) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/or_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/simple/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/simple/README.generated.md new file mode 100644 index 0000000..d60ccc5 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/simple/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/simple/input.js new file mode 100644 index 0000000..839ca11 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple/input.js @@ -0,0 +1 @@ +1 + 1; diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/simple/output.generated.txt new file mode 100644 index 0000000..066ce05 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple/output.generated.txt @@ -0,0 +1,37 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: %0 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.binary_expression"(%0, %1) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%2) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %0 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %1 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.binary_expression (%0, %1) {"+"} +// JSLIR-NEXT: // %2 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%2) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/simple/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/README.generated.md new file mode 100644 index 0000000..8704c8e --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/input.js new file mode 100644 index 0000000..38a1a30 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/input.js @@ -0,0 +1,2 @@ +var a = 1; +a + 1; diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/output.generated.txt new file mode 100644 index 0000000..2382c5a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/output.generated.txt @@ -0,0 +1,60 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %3 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.variable_declarator"(%3, %4) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%5) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.binary_expression"(%0, %1) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%2) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %4 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.variable_declarator (%3, %4) +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%5) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier {"a"} +// JSLIR-NEXT: // %0 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %1 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.binary_expression (%0, %1) {"+"} +// JSLIR-NEXT: // %2 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%2) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/simple_symbol/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/switch/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/switch/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/switch/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/switch/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/switch/README.generated.md new file mode 100644 index 0000000..393c105 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/switch/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/switch/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/switch/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/switch/input.js new file mode 100644 index 0000000..356a349 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/switch/input.js @@ -0,0 +1,13 @@ +var x = 2; +switch (x) { + case 1: + break; + case 2: + case 3: + x = 4; + break; + case 4: + x = 5; + break; +}; +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/switch/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/switch/output.generated.txt new file mode 100644 index 0000000..f622274 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/switch/output.generated.txt @@ -0,0 +1,289 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %28 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %29 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %30 = "jsir.variable_declarator"(%28, %29) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%30) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jslir.switch_statement_start"(%0) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: %2 = "jslir.switch_statement_case_start"(%1) <{case_idx = 0 : ui32}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.switch_statement_case_test"(%3) : (!jsir.any) -> () +// JSLIR-NEXT: %4 = "jsir.binary_expression"(%0, %3) <{operator_ = "==="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %5 = "builtin.unrealized_conversion_cast"(%4) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%5)[^bb2, ^bb4] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%2) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.break_statement"() : () -> () +// JSLIR-NEXT: "cf.br"()[^bb12] : () -> () +// JSLIR-NEXT: ^bb3: // no predecessors +// JSLIR-NEXT: "cf.br"()[^bb5] : () -> () +// JSLIR-NEXT: ^bb4: // pred: ^bb1 +// JSLIR-NEXT: %6 = "jslir.switch_statement_case_start"(%1) <{case_idx = 1 : ui32}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.switch_statement_case_test"(%7) : (!jsir.any) -> () +// JSLIR-NEXT: %8 = "jsir.binary_expression"(%0, %7) <{operator_ = "==="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %9 = "builtin.unrealized_conversion_cast"(%8) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%9)[^bb5, ^bb6] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb5: // 2 preds: ^bb3, ^bb4 +// JSLIR-NEXT: "jslir.control_flow_marker"(%6) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb7] : () -> () +// JSLIR-NEXT: ^bb6: // pred: ^bb4 +// JSLIR-NEXT: %10 = "jslir.switch_statement_case_start"(%1) <{case_idx = 2 : ui32}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.switch_statement_case_test"(%11) : (!jsir.any) -> () +// JSLIR-NEXT: %12 = "jsir.binary_expression"(%0, %11) <{operator_ = "==="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %13 = "builtin.unrealized_conversion_cast"(%12) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%13)[^bb7, ^bb9] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb7: // 2 preds: ^bb5, ^bb6 +// JSLIR-NEXT: "jslir.control_flow_marker"(%10) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %14 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.numeric_literal"() <{extra = #jsir, value = 4.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %16 = "jsir.assignment_expression"(%14, %15) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%16) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.break_statement"() : () -> () +// JSLIR-NEXT: "cf.br"()[^bb12] : () -> () +// JSLIR-NEXT: ^bb8: // no predecessors +// JSLIR-NEXT: "cf.br"()[^bb10] : () -> () +// JSLIR-NEXT: ^bb9: // pred: ^bb6 +// JSLIR-NEXT: %17 = "jslir.switch_statement_case_start"(%1) <{case_idx = 3 : ui32}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %18 = "jsir.numeric_literal"() <{extra = #jsir, value = 4.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.switch_statement_case_test"(%18) : (!jsir.any) -> () +// JSLIR-NEXT: %19 = "jsir.binary_expression"(%0, %18) <{operator_ = "==="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %20 = "builtin.unrealized_conversion_cast"(%19) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%20)[^bb10, ^bb12] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb10: // 2 preds: ^bb8, ^bb9 +// JSLIR-NEXT: "jslir.control_flow_marker"(%17) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %21 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %22 = "jsir.numeric_literal"() <{extra = #jsir, value = 5.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %23 = "jsir.assignment_expression"(%21, %22) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%23) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.break_statement"() : () -> () +// JSLIR-NEXT: "cf.br"()[^bb12] : () -> () +// JSLIR-NEXT: ^bb11: // no predecessors +// JSLIR-NEXT: "cf.br"()[^bb12] : () -> () +// JSLIR-NEXT: ^bb12: // 5 preds: ^bb2, ^bb7, ^bb9, ^bb10, ^bb11 +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jsir.empty_statement"() : () -> () +// JSLIR-NEXT: %24 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %25 = "jsir.member_expression"(%24) <{literal_property = #jsir, , "log", 130, 133, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %26 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %27 = "jsir.call_expression"(%25, %26) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%27) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %28 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %28 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %29 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %29 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %30 = jsir.variable_declarator (%28, %29) +// JSLIR-NEXT: // %30 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%30) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier {"x"} +// JSLIR-NEXT: // %0 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jslir.switch_statement_start (%0) +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jslir.switch_statement_case_start (%1) {0 : ui32} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %3 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.switch_statement_case_test (%3) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.binary_expression (%0, %3) {"==="} +// JSLIR-NEXT: // %4 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = builtin.unrealized_conversion_cast (%4) +// JSLIR-NEXT: // %5 = false +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%5) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%2) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.break_statement +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb4: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jslir.switch_statement_case_start (%1) {1 : ui32} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %7 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.switch_statement_case_test (%7) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.binary_expression (%0, %7) {"==="} +// JSLIR-NEXT: // %8 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = builtin.unrealized_conversion_cast (%8) +// JSLIR-NEXT: // %9 = true +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%9) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb5: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%6) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb6: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jslir.switch_statement_case_start (%1) {2 : ui32} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.switch_statement_case_test (%11) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.binary_expression (%0, %11) {"==="} +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = builtin.unrealized_conversion_cast (%12) +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%13) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb7: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%10) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.numeric_literal {#jsir, 4.000000e+00 : f64} +// JSLIR-NEXT: // %15 = 4.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.assignment_expression (%14, %15) {"="} +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%16) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.break_statement +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb8: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb9: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jslir.switch_statement_case_start (%1) {3 : ui32} +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.numeric_literal {#jsir, 4.000000e+00 : f64} +// JSLIR-NEXT: // %18 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.switch_statement_case_test (%18) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.binary_expression (%0, %18) {"==="} +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = builtin.unrealized_conversion_cast (%19) +// JSLIR-NEXT: // %20 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%20) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb10: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%17) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %21 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %21 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %22 = jsir.numeric_literal {#jsir, 5.000000e+00 : f64} +// JSLIR-NEXT: // %22 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %23 = jsir.assignment_expression (%21, %22) {"="} +// JSLIR-NEXT: // %23 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%23) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.break_statement +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb11: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb12: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.empty_statement +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %24 = jsir.identifier {"console"} +// JSLIR-NEXT: // %24 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %25 = jsir.member_expression (%24) {#jsir, , "log", 130, 133, 0, "log">} +// JSLIR-NEXT: // %25 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %26 = jsir.identifier {"x"} +// JSLIR-NEXT: // %26 = 4.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %27 = jsir.call_expression (%25, %26) +// JSLIR-NEXT: // %27 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%27) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/switch/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/switch/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/switch/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/README.generated.md new file mode 100644 index 0000000..e8b651c --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/input.js new file mode 100644 index 0000000..4124ed8 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/input.js @@ -0,0 +1,9 @@ +var x = 1; +try { + x = 2; +} catch (e) { + x = 3; +} finally { + x = 4; +} +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/output.generated.txt new file mode 100644 index 0000000..115e7e9 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/output.generated.txt @@ -0,0 +1,199 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %18 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %19 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %20 = "jsir.variable_declarator"(%18, %19) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%20) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // pred: ^bb0 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %1 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %2 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.assignment_expression"(%2, %3) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%4) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%1) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb2: // no predecessors +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %5 = "jsir.identifier_ref"() <{name = "e"}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.catch_clause_start"(%5) : (!jsir.any) -> () +// JSLIR-NEXT: %6 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%6) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%6) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %7 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.assignment_expression"(%7, %8) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%9) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%6) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb3] : () -> () +// JSLIR-NEXT: ^bb3: // 2 preds: ^bb1, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %10 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%10) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%10) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %11 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.numeric_literal"() <{extra = #jsir, value = 4.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.assignment_expression"(%11, %12) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%13) : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%10) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb4] : () -> () +// JSLIR-NEXT: ^bb4: // pred: ^bb3 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %14 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.member_expression"(%14) <{literal_property = #jsir, , "log", 80, 83, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %16 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.call_expression"(%15, %16) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%17) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %18 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %19 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.variable_declarator (%18, %19) +// JSLIR-NEXT: // %20 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%20) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSLIR-NEXT: // %3 = 2.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.assignment_expression (%2, %3) {"="} +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%4) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%1) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.identifier_ref {"e"} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.catch_clause_start (%5) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %6 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%6) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%6) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.assignment_expression (%7, %8) {"="} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%9) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%6) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%10) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%10) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.identifier_ref {"x"} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.numeric_literal {#jsir, 4.000000e+00 : f64} +// JSLIR-NEXT: // %12 = 4.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.assignment_expression (%11, %12) {"="} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%13) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%10) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb4: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.identifier {"console"} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.member_expression (%14) {#jsir, , "log", 80, 83, 0, "log">} +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.identifier {"x"} +// JSLIR-NEXT: // %16 = 4.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.call_expression (%15, %16) +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%17) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/README.generated.md new file mode 100644 index 0000000..cffd8b3 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/input.js new file mode 100644 index 0000000..4124ed8 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/input.js @@ -0,0 +1,9 @@ +var x = 1; +try { + x = 2; +} catch (e) { + x = 3; +} finally { + x = 4; +} +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/output.generated.txt new file mode 100644 index 0000000..e7e1c7c --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/output.generated.txt @@ -0,0 +1,181 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.variable_declarator"(%4, %5) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jshir.try_statement"() ({ +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.assignment_expression"(%4, %5) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "e"}> : () -> !jsir.any +// JSHIR-NEXT: "jshir.catch_clause"(%4) ({ +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %5 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %7 = "jsir.assignment_expression"(%5, %6) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%7) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 4.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.assignment_expression"(%4, %5) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 80, 83, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "x"}> : () -> !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: }, { +// 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: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.variable_declarator (%4, %5) +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.try_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 2.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.assignment_expression (%4, %5) {"="} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier_ref {"e"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.catch_clause (%4) ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.numeric_literal {#jsir, 3.000000e+00 : f64} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.assignment_expression (%5, %6) {"="} +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%7) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 4.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 4.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.assignment_expression (%4, %5) {"="} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// 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", 80, 83, 0, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"x"} +// JSHIR-NEXT: // %2 = 4.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/try_catch_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/README.generated.md new file mode 100644 index 0000000..0a85520 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/input.js new file mode 100644 index 0000000..b9c8d16 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/input.js @@ -0,0 +1,2 @@ +a = 1; +var c = a; diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/output.generated.txt new file mode 100644 index 0000000..e3f94fb --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/output.generated.txt @@ -0,0 +1,60 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.assignment_expression"(%0, %1) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%2) : (!jsir.any) -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %3 = "jsir.identifier_ref"() <{name = "c"}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.identifier"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.variable_declarator"(%3, %4) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%5) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %1 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.assignment_expression (%0, %1) {"="} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%2) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.identifier_ref {"c"} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.identifier {"a"} +// JSLIR-NEXT: // %4 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.variable_declarator (%3, %4) +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%5) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/undeclared_var/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/README.generated.md new file mode 100644 index 0000000..db05158 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/input.js new file mode 100644 index 0000000..6284d1b --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/input.js @@ -0,0 +1,10 @@ +a = 0; +a++; + +b = 0; +++b; + +should_be_0 = --a; + +unknown = getUnknown(); +unknown++; diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/output.generated.txt new file mode 100644 index 0000000..b2d1239 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/output.generated.txt @@ -0,0 +1,123 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.assignment_expression"(%0, %1) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%2) : (!jsir.any) -> () +// JSLIR-NEXT: %3 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %4 = "jsir.update_expression"(%3) <{operator_ = "++", prefix = false}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%4) : (!jsir.any) -> () +// JSLIR-NEXT: %5 = "jsir.identifier_ref"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.assignment_expression"(%5, %6) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%7) : (!jsir.any) -> () +// JSLIR-NEXT: %8 = "jsir.identifier_ref"() <{name = "b"}> : () -> !jsir.any +// JSLIR-NEXT: %9 = "jsir.update_expression"(%8) <{operator_ = "++", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%9) : (!jsir.any) -> () +// JSLIR-NEXT: %10 = "jsir.identifier_ref"() <{name = "should_be_0"}> : () -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.update_expression"(%11) <{operator_ = "--", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %13 = "jsir.assignment_expression"(%10, %12) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%13) : (!jsir.any) -> () +// JSLIR-NEXT: %14 = "jsir.identifier_ref"() <{name = "unknown"}> : () -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.identifier"() <{name = "getUnknown"}> : () -> !jsir.any +// JSLIR-NEXT: %16 = "jsir.call_expression"(%15) : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %17 = "jsir.assignment_expression"(%14, %16) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%17) : (!jsir.any) -> () +// JSLIR-NEXT: %18 = "jsir.identifier_ref"() <{name = "unknown"}> : () -> !jsir.any +// JSLIR-NEXT: %19 = "jsir.update_expression"(%18) <{operator_ = "++", prefix = false}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%19) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %1 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.assignment_expression (%0, %1) {"="} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%2) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.update_expression (%3) {"++", false} +// JSLIR-NEXT: // %4 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%4) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.identifier_ref {"b"} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %6 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.assignment_expression (%5, %6) {"="} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%7) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.identifier_ref {"b"} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.update_expression (%8) {"++", true} +// JSLIR-NEXT: // %9 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%9) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.identifier_ref {"should_be_0"} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.update_expression (%11) {"--", true} +// JSLIR-NEXT: // %12 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.assignment_expression (%10, %12) {"="} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%13) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.identifier_ref {"unknown"} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.identifier {"getUnknown"} +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.call_expression (%15) +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.assignment_expression (%14, %16) {"="} +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%17) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.identifier_ref {"unknown"} +// JSLIR-NEXT: // %18 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.update_expression (%18) {"++", false} +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%19) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/update_expression/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/void_0/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/void_0/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/README.generated.md new file mode 100644 index 0000000..e68fe2e --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/void_0/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/void_0/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/input.js new file mode 100644 index 0000000..2b60509 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/input.js @@ -0,0 +1 @@ +var a = void 0; diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/void_0/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/output.generated.txt new file mode 100644 index 0000000..077f45e --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/output.generated.txt @@ -0,0 +1,49 @@ +// JSLIR: "jsir.file"() <{comments = []}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %0 = "jsir.identifier_ref"() <{name = "a"}> : () -> !jsir.any +// JSLIR-NEXT: %1 = "jsir.numeric_literal"() <{extra = #jsir, value = 0.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "jsir.unary_expression"(%1) <{operator_ = "void", prefix = true}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %3 = "jsir.variable_declarator"(%0, %2) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%3) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jsir.identifier_ref {"a"} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.numeric_literal {#jsir, 0.000000e+00 : f64} +// JSLIR-NEXT: // %1 = 0.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = jsir.unary_expression (%1) {"void", true} +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jsir.variable_declarator (%0, %2) +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%3) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/void_0/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/void_0/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/while/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/while/README.generated.md new file mode 100644 index 0000000..fe17fb1 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/while/input.js \ + --passes "source2ast,ast2hir,hir2lir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/while/input.js new file mode 100644 index 0000000..3a8a967 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while/input.js @@ -0,0 +1,9 @@ +// TODO(b/217662731): `is_a_const` should be a const. + +var not_a_const = 1; +while (x) { + not_a_const = not_a_const + 1; + var is_a_const = 1; +} +console.log(not_a_const); +console.log(is_a_const); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/while/output.generated.txt new file mode 100644 index 0000000..2f18192 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while/output.generated.txt @@ -0,0 +1,184 @@ +// JSLIR: "jsir.file"() <{comments = [#jsir, , 0, 53, " TODO(b/217662731): `is_a_const` should be a const.">]}> ({ +// JSLIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %20 = "jsir.identifier_ref"() <{name = "not_a_const"}> : () -> !jsir.any +// JSLIR-NEXT: %21 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %22 = "jsir.variable_declarator"(%20, %21) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%22) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: %0 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb1: // 2 preds: ^bb0, ^bb2 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %1 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSLIR-NEXT: %2 = "builtin.unrealized_conversion_cast"(%1) : (!jsir.any) -> i1 +// JSLIR-NEXT: "cf.cond_br"(%2)[^bb2, ^bb3] <{operandSegmentSizes = array}> : (i1) -> () +// JSLIR-NEXT: ^bb2: // pred: ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %3 = "jslir.control_flow_starter"() <{kind = #jsir}> : () -> !jsir.any +// JSLIR-NEXT: "jslir.control_flow_marker"(%3) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%3) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "not_a_const"}> : () -> !jsir.any +// JSLIR-NEXT: %5 = "jsir.identifier"() <{name = "not_a_const"}> : () -> !jsir.any +// JSLIR-NEXT: %6 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %7 = "jsir.binary_expression"(%5, %6) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: %8 = "jsir.assignment_expression"(%4, %7) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%8) : (!jsir.any) -> () +// JSLIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSLIR-NEXT: %17 = "jsir.identifier_ref"() <{name = "is_a_const"}> : () -> !jsir.any +// JSLIR-NEXT: %18 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSLIR-NEXT: %19 = "jsir.variable_declarator"(%17, %18) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.exprs_region_end"(%19) : (!jsir.any) -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: "jslir.control_flow_marker"(%3) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: "cf.br"()[^bb1] : () -> () +// JSLIR-NEXT: ^bb3: // pred: ^bb1 +// JSLIR-NEXT: "jslir.control_flow_marker"(%0) <{kind = #jsir}> : (!jsir.any) -> () +// JSLIR-NEXT: %9 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %10 = "jsir.member_expression"(%9) <{literal_property = #jsir, , "log", 153, 156, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %11 = "jsir.identifier"() <{name = "not_a_const"}> : () -> !jsir.any +// JSLIR-NEXT: %12 = "jsir.call_expression"(%10, %11) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%12) : (!jsir.any) -> () +// JSLIR-NEXT: %13 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSLIR-NEXT: %14 = "jsir.member_expression"(%13) <{literal_property = #jsir, , "log", 179, 182, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSLIR-NEXT: %15 = "jsir.identifier"() <{name = "is_a_const"}> : () -> !jsir.any +// JSLIR-NEXT: %16 = "jsir.call_expression"(%14, %15) : (!jsir.any, !jsir.any) -> !jsir.any +// JSLIR-NEXT: "jsir.expression_statement"(%16) : (!jsir.any) -> () +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: }) : () -> () +// JSLIR-NEXT: jsir.file {[#jsir, , 0, 53, " TODO(b/217662731): `is_a_const` should be a const.">]} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.program {"script"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %20 = jsir.identifier_ref {"not_a_const"} +// JSLIR-NEXT: // %20 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %21 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %21 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %22 = jsir.variable_declarator (%20, %21) +// JSLIR-NEXT: // %22 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%22) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %0 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %0 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb1: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %1 = jsir.identifier {"x"} +// JSLIR-NEXT: // %1 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %2 = builtin.unrealized_conversion_cast (%1) +// JSLIR-NEXT: // %2 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.cond_br (%2) {array} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb2: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %3 = jslir.control_flow_starter {#jsir} +// JSLIR-NEXT: // %3 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%3) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%3) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %4 = jsir.identifier_ref {"not_a_const"} +// JSLIR-NEXT: // %4 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %5 = jsir.identifier {"not_a_const"} +// JSLIR-NEXT: // %5 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %6 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %6 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %7 = jsir.binary_expression (%5, %6) {"+"} +// JSLIR-NEXT: // %7 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %8 = jsir.assignment_expression (%4, %7) {"="} +// JSLIR-NEXT: // %8 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%8) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %17 = jsir.identifier_ref {"is_a_const"} +// JSLIR-NEXT: // %17 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %18 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSLIR-NEXT: // %18 = 1.000000e+00 : f64 +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %19 = jsir.variable_declarator (%17, %18) +// JSLIR-NEXT: // %19 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.exprs_region_end (%19) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%3) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: cf.br +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: ^bb3: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jslir.control_flow_marker (%0) {#jsir} +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %9 = jsir.identifier {"console"} +// JSLIR-NEXT: // %9 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %10 = jsir.member_expression (%9) {#jsir, , "log", 153, 156, 0, "log">} +// JSLIR-NEXT: // %10 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %11 = jsir.identifier {"not_a_const"} +// JSLIR-NEXT: // %11 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %12 = jsir.call_expression (%10, %11) +// JSLIR-NEXT: // %12 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%12) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %13 = jsir.identifier {"console"} +// JSLIR-NEXT: // %13 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %14 = jsir.member_expression (%13) {#jsir, , "log", 179, 182, 0, "log">} +// JSLIR-NEXT: // %14 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %15 = jsir.identifier {"is_a_const"} +// JSLIR-NEXT: // %15 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: %16 = jsir.call_expression (%14, %15) +// JSLIR-NEXT: // %16 = +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: jsir.expression_statement (%16) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }, { +// JSLIR-NEXT: ^bb0: +// JSLIR-NEXT: // +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } +// JSLIR-NEXT: }) +// JSLIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/while/run.generated.lit new file mode 100644 index 0000000..fa9a70a --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2lir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSLIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/README.generated.md new file mode 100644 index 0000000..0e94dd0 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/input.js new file mode 100644 index 0000000..10502fb --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/input.js @@ -0,0 +1,5 @@ +var x = 1; +while (false) { + x = 2; +} +console.log(x); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/output.generated.txt new file mode 100644 index 0000000..f78bb92 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/output.generated.txt @@ -0,0 +1,113 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.variable_declarator"(%4, %5) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jshir.while_statement"() ({ +// JSHIR-NEXT: %4 = "jsir.boolean_literal"() <{value = false}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%4) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %4 = "jsir.identifier_ref"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.assignment_expression"(%4, %5) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%6) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 46, 49, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "x"}> : () -> !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: }, { +// 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: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %5 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.variable_declarator (%4, %5) +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.while_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.boolean_literal {false} +// JSHIR-NEXT: // %4 = false +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%4) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier_ref {"x"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.numeric_literal {#jsir, 2.000000e+00 : f64} +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.assignment_expression (%4, %5) {"="} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%6) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// 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", 46, 49, 0, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"x"} +// JSHIR-NEXT: // %2 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_dead_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/BUILD b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/BUILD new file mode 100644 index 0000000..9944d5f --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/BUILD @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +glob_lit_tests( + name = "all_tests", + data = [ + "README.generated.md", + "input.js", + "output.generated.txt", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/README.generated.md b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/README.generated.md new file mode 100644 index 0000000..86f9b1e --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/README.generated.md @@ -0,0 +1,8 @@ +To run manually: + +```shell +blaze run //third_party/maldoca/js/ir:jsir_gen -- \ + --input_file $(pwd)/third_party/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/input.js \ + --passes "source2ast,ast2hir" \ + --jsir_analysis constant_propagation +``` diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/input.js b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/input.js new file mode 100644 index 0000000..3a8a967 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/input.js @@ -0,0 +1,9 @@ +// TODO(b/217662731): `is_a_const` should be a const. + +var not_a_const = 1; +while (x) { + not_a_const = not_a_const + 1; + var is_a_const = 1; +} +console.log(not_a_const); +console.log(is_a_const); diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/output.generated.txt b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/output.generated.txt new file mode 100644 index 0000000..cb38535 --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/output.generated.txt @@ -0,0 +1,163 @@ +// JSHIR: "jsir.file"() <{comments = [#jsir, , 0, 53, " TODO(b/217662731): `is_a_const` should be a const.">]}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %8 = "jsir.identifier_ref"() <{name = "not_a_const"}> : () -> !jsir.any +// JSHIR-NEXT: %9 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %10 = "jsir.variable_declarator"(%8, %9) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%10) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: "jshir.while_statement"() ({ +// JSHIR-NEXT: %8 = "jsir.identifier"() <{name = "x"}> : () -> !jsir.any +// JSHIR-NEXT: "jsir.expr_region_end"(%8) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %8 = "jsir.identifier_ref"() <{name = "not_a_const"}> : () -> !jsir.any +// JSHIR-NEXT: %9 = "jsir.identifier"() <{name = "not_a_const"}> : () -> !jsir.any +// JSHIR-NEXT: %10 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %11 = "jsir.binary_expression"(%9, %10) <{operator_ = "+"}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: %12 = "jsir.assignment_expression"(%8, %11) <{operator_ = "="}> : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%12) : (!jsir.any) -> () +// JSHIR-NEXT: "jsir.variable_declaration"() <{kind = "var"}> ({ +// JSHIR-NEXT: %13 = "jsir.identifier_ref"() <{name = "is_a_const"}> : () -> !jsir.any +// JSHIR-NEXT: %14 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %15 = "jsir.variable_declarator"(%13, %14) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.exprs_region_end"(%15) : (!jsir.any) -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: %0 = "jsir.identifier"() <{name = "console"}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.member_expression"(%0) <{literal_property = #jsir, , "log", 153, 156, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %2 = "jsir.identifier"() <{name = "not_a_const"}> : () -> !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", 179, 182, 0, "log">}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: %6 = "jsir.identifier"() <{name = "is_a_const"}> : () -> !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: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: jsir.file {[#jsir, , 0, 53, " TODO(b/217662731): `is_a_const` should be a const.">]} ({ +// 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: %8 = jsir.identifier_ref {"not_a_const"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %9 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.variable_declarator (%8, %9) +// JSHIR-NEXT: // %10 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%10) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.while_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier {"x"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expr_region_end (%8) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jshir.block_statement ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %8 = jsir.identifier_ref {"not_a_const"} +// JSHIR-NEXT: // %8 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %9 = jsir.identifier {"not_a_const"} +// JSHIR-NEXT: // %9 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %10 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %10 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %11 = jsir.binary_expression (%9, %10) {"+"} +// JSHIR-NEXT: // %11 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %12 = jsir.assignment_expression (%8, %11) {"="} +// JSHIR-NEXT: // %12 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%12) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.variable_declaration {"var"} ({ +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %13 = jsir.identifier_ref {"is_a_const"} +// JSHIR-NEXT: // %13 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %14 = jsir.numeric_literal {#jsir, 1.000000e+00 : f64} +// JSHIR-NEXT: // %14 = 1.000000e+00 : f64 +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %15 = jsir.variable_declarator (%13, %14) +// JSHIR-NEXT: // %15 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.exprs_region_end (%15) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// 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", 153, 156, 0, "log">} +// JSHIR-NEXT: // %1 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %2 = jsir.identifier {"not_a_const"} +// JSHIR-NEXT: // %2 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %3 = jsir.call_expression (%1, %2) +// JSHIR-NEXT: // %3 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%3) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %4 = jsir.identifier {"console"} +// JSHIR-NEXT: // %4 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %5 = jsir.member_expression (%4) {#jsir, , "log", 179, 182, 0, "log">} +// JSHIR-NEXT: // %5 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %6 = jsir.identifier {"is_a_const"} +// JSHIR-NEXT: // %6 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: %7 = jsir.call_expression (%5, %6) +// JSHIR-NEXT: // %7 = +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: jsir.expression_statement (%7) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: // +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } +// JSHIR-NEXT: }) +// JSHIR-NEXT: // State [default = ] { } diff --git a/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/run.generated.lit b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/run.generated.lit new file mode 100644 index 0000000..f120aee --- /dev/null +++ b/maldoca/js/ir/analyses/constant_propagation/tests/while_jshir/run.generated.lit @@ -0,0 +1,5 @@ +// RUN: CURRENT_FILE_BASENAME=$(basename %s .lit) && \ +// RUN: jsir_gen --input_file "$(dirname %s)"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: --jsir_analysis constant_propagation \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname %s)"/output.generated.txt