From 3b43349bc5e472f42dbbdffdf96836fbf0f397c6 Mon Sep 17 00:00:00 2001 From: Nora Sandler Date: Fri, 1 Dec 2023 00:41:23 +0000 Subject: [PATCH] Int-only dead store elimination tests --- expected_results.json | 2 +- generate_expected_results.py | 39 ++++---- test_framework/basic.py | 85 +++++++++--------- test_framework/tacky/common.py | 4 +- test_framework/tacky/dead_store_elim.py | 11 ++- test_properties.json | 7 +- .../dead_store_elimination/README.md | 3 + .../int_only/dead_store_static_var.c | 31 +++++-- .../int_only/delete_arithmetic_ops.c | 17 ++++ .../int_only/dont_elim/add_all_to_worklist.c | 17 ++-- .../int_only/dont_elim/dont_remove_funcall.c | 13 +-- .../int_only/dont_elim/loop.c | 32 ++++--- .../int_only/dont_elim/nested_loops.c | 31 +++++++ .../int_only/dont_elim/recognize_all_uses.c | 88 +++++++++++++++++++ .../int_only/dont_elim/self_copy.c | 26 ++++++ .../int_only/dont_elim/static_vars_at_exit.c | 18 ++-- .../int_only/dont_elim/static_vars_fun.c | 13 +-- .../int_only/dont_elim/used_one_path.c | 23 +++-- .../int_only/elim_second_copy.c | 34 +++++-- .../int_only/fig_19_11.c | 34 +++++++ .../int_only/fig_19_12.c | 15 ---- .../initialize_blocks_with_empty_set.c | 23 +++++ .../int_only/loop_dead_store.c | 32 +++++-- .../dead_store_elimination/int_only/simple.c | 11 ++- .../int_only/static_not_always_live.c | 33 +++++++ .../int_only/use_and_kill.c | 10 --- 26 files changed, 482 insertions(+), 170 deletions(-) create mode 100644 tests/chapter_19/dead_store_elimination/README.md create mode 100644 tests/chapter_19/dead_store_elimination/int_only/delete_arithmetic_ops.c create mode 100644 tests/chapter_19/dead_store_elimination/int_only/dont_elim/nested_loops.c create mode 100644 tests/chapter_19/dead_store_elimination/int_only/dont_elim/recognize_all_uses.c create mode 100644 tests/chapter_19/dead_store_elimination/int_only/dont_elim/self_copy.c create mode 100644 tests/chapter_19/dead_store_elimination/int_only/fig_19_11.c delete mode 100644 tests/chapter_19/dead_store_elimination/int_only/fig_19_12.c create mode 100644 tests/chapter_19/dead_store_elimination/int_only/initialize_blocks_with_empty_set.c create mode 100644 tests/chapter_19/dead_store_elimination/int_only/static_not_always_live.c delete mode 100644 tests/chapter_19/dead_store_elimination/int_only/use_and_kill.c diff --git a/expected_results.json b/expected_results.json index 1c57377f..e30b3396 100644 --- a/expected_results.json +++ b/expected_results.json @@ -1 +1 @@ -{"chapter_6/valid/rh_assignment.c": {"return_code": 1}, "chapter_6/valid/if_nested_2.c": {"return_code": 2}, "chapter_6/valid/if_nested_3.c": {"return_code": 3}, "chapter_6/valid/nested_ternary.c": {"return_code": 7}, "chapter_6/valid/binary_false_condition.c": {"return_code": 0}, "chapter_6/valid/else.c": {"return_code": 2}, "chapter_6/valid/nested_ternary_2.c": {"return_code": 15}, "chapter_6/valid/ternary_short_circuit.c": {"return_code": 1}, "chapter_6/valid/multiple_if.c": {"return_code": 8}, "chapter_6/valid/if_null_body.c": {"return_code": 1}, "chapter_6/valid/ternary_rh_binop.c": {"return_code": 1}, "chapter_6/valid/ternary_middle_assignment.c": {"return_code": 2}, "chapter_6/valid/if_nested_4.c": {"return_code": 4}, "chapter_6/valid/ternary_middle_binop.c": {"return_code": 1}, "chapter_6/valid/if_taken.c": {"return_code": 1}, "chapter_6/valid/if_not_taken.c": {"return_code": 0}, "chapter_6/valid/if_nested_5.c": {"return_code": 1}, "chapter_6/valid/assign_ternary.c": {"return_code": 2}, "chapter_6/valid/ternary.c": {"return_code": 4}, "chapter_6/valid/if_nested.c": {"return_code": 1}, "chapter_6/valid/ternary_short_circuit_2.c": {"return_code": 2}, "chapter_6/valid/binary_condition.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_label_and_var.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_label_main_2.c": {"return_code": 0}, "chapter_6/valid/extra_credit/bitwise_ternary.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_label_main.c": {"return_code": 0}, "chapter_6/valid/extra_credit/goto_nested_label.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_backwards.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_label.c": {"return_code": 1}, "chapter_6/valid/extra_credit/compound_if_expression.c": {"return_code": 1}, "chapter_6/valid/extra_credit/goto_after_declaration.c": {"return_code": 1}, "chapter_8/valid/for.c": {"return_code": 16}, "chapter_8/valid/continue.c": {"return_code": 1}, "chapter_8/valid/multi_continue_same_loop.c": {"return_code": 1}, "chapter_8/valid/for_absent_post.c": {"return_code": 0}, "chapter_8/valid/null_for_header.c": {"return_code": 4}, "chapter_8/valid/nested_loop.c": {"return_code": 1}, "chapter_8/valid/nested_break.c": {"return_code": 250}, "chapter_8/valid/do_while.c": {"return_code": 16}, "chapter_8/valid/for_absent_condition.c": {"return_code": 0}, "chapter_8/valid/do_while_break_immediate.c": {"return_code": 10}, "chapter_8/valid/continue_empty_post.c": {"return_code": 30}, "chapter_8/valid/nested_continue.c": {"return_code": 24}, "chapter_8/valid/break.c": {"return_code": 1}, "chapter_8/valid/for_nested_shadow.c": {"return_code": 1}, "chapter_8/valid/empty_expression.c": {"return_code": 0}, "chapter_8/valid/multi_break.c": {"return_code": 1}, "chapter_8/valid/for_decl.c": {"return_code": 101}, "chapter_8/valid/for_shadow.c": {"return_code": 1}, "chapter_8/valid/break_immediate.c": {"return_code": 1}, "chapter_8/valid/while.c": {"return_code": 6}, "chapter_8/valid/empty_loop_body.c": {"return_code": 252}, "chapter_8/valid/extra_credit/switch_fallthrough.c": {"return_code": 4}, "chapter_8/valid/extra_credit/compound_assignment_for_loop.c": {"return_code": 10}, "chapter_8/valid/extra_credit/switch_break.c": {"return_code": 5}, "chapter_8/valid/extra_credit/switch_default.c": {"return_code": 22}, "chapter_8/valid/extra_credit/switch_default_fallthrough.c": {"return_code": 0}, "chapter_8/valid/extra_credit/switch_with_loop.c": {"return_code": 123}, "chapter_8/valid/extra_credit/switch_assign_in_body.c": {"return_code": 3}, "chapter_8/valid/extra_credit/switch_in_loop.c": {"return_code": 1}, "chapter_8/valid/extra_credit/switch_no_case.c": {"return_code": 4}, "chapter_8/valid/extra_credit/switch_nested_case.c": {"return_code": 3}, "chapter_8/valid/extra_credit/switch_nested_not_taken.c": {"return_code": 2}, "chapter_8/valid/extra_credit/switch_decl.c": {"return_code": 7}, "chapter_8/valid/extra_credit/switch_with_continue.c": {"return_code": 5}, "chapter_8/valid/extra_credit/switch_empty.c": {"return_code": 10}, "chapter_8/valid/extra_credit/goto_loop_body.c": {"return_code": 1}, "chapter_8/valid/extra_credit/goto_bypass_condition.c": {"return_code": 10}, "chapter_8/valid/extra_credit/switch_nested_switch.c": {"return_code": 1}, "chapter_8/valid/extra_credit/switch_block.c": {"return_code": 1}, "chapter_8/valid/extra_credit/switch_default_not_last.c": {"return_code": 0}, "chapter_8/valid/extra_credit/switch_assign_in_condition.c": {"return_code": 2}, "chapter_8/valid/extra_credit/switch.c": {"return_code": 3}, "chapter_8/valid/extra_credit/switch_goto_mid_case.c": {"return_code": 1}, "chapter_14/valid/libraries/static_pointer.c": {"return_code": 0}, "chapter_14/valid/libraries/global_pointer.c": {"return_code": 1}, "chapter_14/valid/function_calls/address_of_argument.c": {"return_code": 0}, "chapter_14/valid/function_calls/update_value_through_pointer_parameter.c": {"return_code": 0}, "chapter_14/valid/function_calls/return_pointer.c": {"return_code": 0}, "chapter_14/valid/extra_credit/incr_through_pointer.c": {"return_code": 11}, "chapter_14/valid/extra_credit/compound_assign_through_pointer.c": {"return_code": 1}, "chapter_14/valid/declarators/declare_pointer_in_for_loop.c": {"return_code": 5}, "chapter_14/valid/declarators/abstract_declarators.c": {"return_code": 0}, "chapter_14/valid/declarators/declarators.c": {"return_code": 0}, "chapter_14/valid/dereference/static_var_indirection.c": {"return_code": 0}, "chapter_14/valid/dereference/multilevel_indirection.c": {"return_code": 0}, "chapter_14/valid/dereference/read_through_pointers.c": {"return_code": 0}, "chapter_14/valid/dereference/update_through_pointers.c": {"return_code": 0}, "chapter_14/valid/dereference/address_of_dereference.c": {"return_code": 0}, "chapter_14/valid/dereference/simple.c": {"return_code": 3}, "chapter_14/valid/dereference/dereference_expression_result.c": {"return_code": 0}, "chapter_14/valid/casts/cast_between_pointer_types.c": {"return_code": 0}, "chapter_14/valid/casts/pointer_int_casts.c": {"return_code": 0}, "chapter_14/valid/casts/null_pointer_conversion.c": {"return_code": 0}, "chapter_14/valid/comparisons/compare_pointers.c": {"return_code": 0}, "chapter_14/valid/comparisons/pointers_as_conditions.c": {"return_code": 0}, "chapter_14/valid/comparisons/compare_to_null.c": {"return_code": 0}, "chapter_10/valid/static_then_extern.c": {"return_code": 3}, "chapter_10/valid/push_arg_on_page_boundary.c": {"return_code": 1}, "chapter_10/valid/static_local_multiple_scopes.c": {"return_code": 0, "stdout": "Aa\nBb\nCc\nDd\nEe\nFf\nGg\nHh\nIi\nJj\nKk\nLl\nMm\nNn\nOo\nPp\nQq\nRr\nSs\nTt\nUu\nVv\nWw\nXx\nYy\nZz\n"}, "chapter_10/valid/tentative_definition.c": {"return_code": 5}, "chapter_10/valid/static_variables_in_expressions.c": {"return_code": 0}, "chapter_10/valid/static_recursive_call.c": {"return_code": 0, "stdout": "ABCDEFGHIJKLMNOPQRSTUVWXYZ"}, "chapter_10/valid/shadow_static_local_var.c": {"return_code": 0}, "chapter_10/valid/multiple_static_local.c": {"return_code": 29}, "chapter_10/valid/multiple_static_file_scope_vars.c": {"return_code": 4}, "chapter_10/valid/static_local_uninitialized.c": {"return_code": 4}, "chapter_10/valid/type_before_storage_class.c": {"return_code": 7}, "chapter_10/valid/extern_block_scope_variable.c": {"return_code": 3}, "chapter_10/valid/distinct_local_and_extern.c": {"return_code": 7}, "chapter_10/valid/libraries/internal_hides_external_linkage.c": {"return_code": 0}, "chapter_10/valid/libraries/external_tentative_var.c": {"return_code": 0}, "chapter_10/valid/libraries/external_linkage_function.c": {"return_code": 0}, "chapter_10/valid/libraries/external_variable.c": {"return_code": 0}, "chapter_10/valid/libraries/internal_linkage_var.c": {"return_code": 0}, "chapter_10/valid/libraries/external_var_scoping.c": {"return_code": 0}, "chapter_10/valid/libraries/internal_linkage_function.c": {"return_code": 0}, "chapter_10/valid/extra_credit/goto_skip_static_initializer.c": {"return_code": 10}, "chapter_2/valid/neg.c": {"return_code": 251}, "chapter_2/valid/negate_int_max.c": {"return_code": 1}, "chapter_2/valid/redundant_parens.c": {"return_code": 246}, "chapter_2/valid/neg_zero.c": {"return_code": 0}, "chapter_2/valid/bitwise_int_min.c": {"return_code": 254}, "chapter_2/valid/bitwise_zero.c": {"return_code": 255}, "chapter_2/valid/parens_3.c": {"return_code": 4}, "chapter_2/valid/parens_2.c": {"return_code": 253}, "chapter_2/valid/bitwise.c": {"return_code": 243}, "chapter_2/valid/nested_ops_2.c": {"return_code": 1}, "chapter_2/valid/nested_ops.c": {"return_code": 2}, "chapter_2/valid/parens.c": {"return_code": 254}, "chapter_1/valid/return_0.c": {"return_code": 0}, "chapter_1/valid/newlines.c": {"return_code": 0}, "chapter_1/valid/return_2.c": {"return_code": 2}, "chapter_1/valid/multi_digit.c": {"return_code": 100}, "chapter_1/valid/tabs.c": {"return_code": 0}, "chapter_1/valid/spaces.c": {"return_code": 0}, "chapter_1/valid/no_newlines.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/logical.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/arithmetic_ops.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/static_initialized_double.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/comparisons.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/simple.c": {"return_code": 1}, "chapter_13/valid/floating_expressions/loop_controlling_expression.c": {"return_code": 100}, "chapter_13/valid/libraries/double_parameters.c": {"return_code": 0}, "chapter_13/valid/libraries/use_arg_after_fun_call.c": {"return_code": 4}, "chapter_13/valid/libraries/double_and_int_params_recursive.c": {"return_code": 0}, "chapter_13/valid/libraries/extern_double.c": {"return_code": 1}, "chapter_13/valid/libraries/double_params_and_result.c": {"return_code": 1}, "chapter_13/valid/explicit_casts/cvttsd2i_rewrite.c": {"return_code": 0}, "chapter_13/valid/explicit_casts/double_to_signed.c": {"return_code": 0}, "chapter_13/valid/explicit_casts/unsigned_to_double.c": {"return_code": 0}, "chapter_13/valid/explicit_casts/signed_to_double.c": {"return_code": 0}, "chapter_13/valid/explicit_casts/double_to_unsigned.c": {"return_code": 0}, "chapter_13/valid/implicit_casts/convert_for_assignment.c": {"return_code": 0}, "chapter_13/valid/implicit_casts/common_type.c": {"return_code": 0}, "chapter_13/valid/implicit_casts/static_initializers.c": {"return_code": 0}, "chapter_13/valid/implicit_casts/complex_arithmetic_common_type.c": {"return_code": 1}, "chapter_13/valid/constants/round_constants.c": {"return_code": 0}, "chapter_13/valid/constants/constant_doubles.c": {"return_code": 0}, "chapter_13/valid/special_values/subnormal_not_zero.c": {"return_code": 0}, "chapter_13/valid/special_values/negative_zero.c": {"return_code": 0}, "chapter_13/valid/special_values/infinity.c": {"return_code": 0}, "chapter_13/valid/function_calls/double_parameters.c": {"return_code": 0}, "chapter_13/valid/function_calls/double_and_int_parameters.c": {"return_code": 0}, "chapter_13/valid/function_calls/standard_library_call.c": {"return_code": 0}, "chapter_13/valid/function_calls/use_arg_after_fun_call.c": {"return_code": 4}, "chapter_13/valid/function_calls/return_double.c": {"return_code": 1}, "chapter_13/valid/function_calls/double_and_int_params_recursive.c": {"return_code": 0}, "chapter_13/valid/extra_credit/compound_assign.c": {"return_code": 1}, "chapter_13/valid/extra_credit/nan.c": {"return_code": 0}, "chapter_13/valid/extra_credit/compound_assign_implicit_cast.c": {"return_code": 1}, "chapter_18/valid/params_and_returns/temporary_lifetime.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/ignore_retval.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/return_space_overlap.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/return_big_struct_on_page_boundary.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/simple.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/return_struct_on_page_boundary.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/return_incomplete_type.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/stack_clobber.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/libraries/return_calling_conventions.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/libraries/missing_retval.c": {"return_code": 1}, "chapter_18/valid/params_and_returns/libraries/access_retval_members.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/libraries/retval_struct_sizes.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/semantic_analysis/resolve_tags.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/semantic_analysis/namespaces.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/semantic_analysis/incomplete_structs.c": {"return_code": 0, "stdout": "I'm a struct!\n"}, "chapter_18/valid/no_structure_parameters/semantic_analysis/cast_struct_to_void.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/global_struct.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/param_struct_pointer.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/return_struct_pointer.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/opaque_struct.c": {"return_code": 0, "stdout": "new struct\nstatic struct\nglobal struct\n"}, "chapter_18/valid/no_structure_parameters/libraries/array_of_structs.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/initializers/auto_struct_initializers.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/initializers/static_struct_initializers.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/initializers/nested_static_struct_initializers.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/initializers/nested_auto_struct_initializers.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/smoke_tests/static_vs_auto.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/smoke_tests/simple.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/size_and_offset_calculations/member_offsets.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/size_and_offset_calculations/sizeof_exps.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/size_and_offset_calculations/sizeof_type.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/scalar_member_access/arrow.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/scalar_member_access/linked_list.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/scalar_member_access/static_structs.c": {"return_code": 0, "stdout": "zero\nmn\nop\nwx\nyz\nBCD\nCDE\nDEF\nEFG\nbcd\ncde\n"}, "chapter_18/valid/no_structure_parameters/scalar_member_access/nested_struct.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/scalar_member_access/dot.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/parse_and_lex/postfix_precedence.c": {"return_code": 1}, "chapter_18/valid/no_structure_parameters/parse_and_lex/trailing_comma.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/parse_and_lex/space_around_struct_member.c": {"return_code": 1}, "chapter_18/valid/no_structure_parameters/parse_and_lex/struct_member_looks_like_const.c": {"return_code": 3}, "chapter_18/valid/no_structure_parameters/struct_copy/copy_struct_through_pointer.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/struct_copy/copy_struct_with_arrow_operator.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/struct_copy/copy_struct.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/struct_copy/stack_clobber.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/struct_copy/copy_struct_with_dot_operator.c": {"return_code": 0}, "chapter_18/valid/parameters/pass_args_on_page_boundary.c": {"return_code": 0}, "chapter_18/valid/parameters/incomplete_param_type.c": {"return_code": 3}, "chapter_18/valid/parameters/simple.c": {"return_code": 0}, "chapter_18/valid/parameters/stack_clobber.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/param_calling_conventions.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/struct_sizes.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/pass_struct.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/modify_param.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/classify_params.c": {"return_code": 0}, "chapter_15/valid/initialization/automatic.c": {"return_code": 0}, "chapter_15/valid/initialization/static.c": {"return_code": 0}, "chapter_15/valid/initialization/trailing_comma_initializer.c": {"return_code": 3}, "chapter_15/valid/initialization/automatic_nested.c": {"return_code": 0}, "chapter_15/valid/initialization/static_nested.c": {"return_code": 0}, "chapter_15/valid/libraries/set_array_val.c": {"return_code": 0}, "chapter_15/valid/libraries/return_pointer_to_array.c": {"return_code": 0}, "chapter_15/valid/libraries/global_array.c": {"return_code": 0}, "chapter_15/valid/subscripting/subscript_nested.c": {"return_code": 0}, "chapter_15/valid/subscripting/subscript_pointer.c": {"return_code": 0}, "chapter_15/valid/subscripting/array_of_pointers_to_arrays.c": {"return_code": 0}, "chapter_15/valid/subscripting/simple_subscripts.c": {"return_code": 0}, "chapter_15/valid/subscripting/simple.c": {"return_code": 3}, "chapter_15/valid/subscripting/complex_operands.c": {"return_code": 0}, "chapter_15/valid/subscripting/addition_subscript_equivalence.c": {"return_code": 0}, "chapter_15/valid/subscripting/subscript_precedence.c": {"return_code": 1}, "chapter_15/valid/allocation/test_alignment.c": {"return_code": 0}, "chapter_15/valid/pointer_arithmetic/pointer_add.c": {"return_code": 0}, "chapter_15/valid/pointer_arithmetic/add_dereference_and_assign.c": {"return_code": 0}, "chapter_15/valid/pointer_arithmetic/pointer_diff.c": {"return_code": 0}, "chapter_15/valid/pointer_arithmetic/compare.c": {"return_code": 0}, "chapter_15/valid/extra_credit/incr_ptr.c": {"return_code": 1}, "chapter_15/valid/declarators/big_array.c": {"return_code": 0}, "chapter_15/valid/declarators/equivalent_declarators.c": {"return_code": 0}, "chapter_15/valid/declarators/return_nested_array.c": {"return_code": 0}, "chapter_15/valid/declarators/array_as_argument.c": {"return_code": 0}, "chapter_15/valid/declarators/for_loop_array.c": {"return_code": 0}, "chapter_15/valid/casts/multi_dim_casts.c": {"return_code": 0}, "chapter_15/valid/casts/implicit_and_explicit_conversions.c": {"return_code": 0}, "chapter_15/valid/casts/cast_array_of_pointers.c": {"return_code": 1}, "chapter_17/valid/void/cast_to_void.c": {"return_code": 12}, "chapter_17/valid/void/void_function.c": {"return_code": 0}, "chapter_17/valid/void/void_for_loop.c": {"return_code": 0, "stdout": "ZYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYZZYXWVUTSRQPONMLKJIHGFEDCBA"}, "chapter_17/valid/void/ternary.c": {"return_code": 0}, "chapter_17/valid/libraries/pass_alloced_memory.c": {"return_code": 0}, "chapter_17/valid/libraries/test_for_memory_leaks.c": {"return_code": 0}, "chapter_17/valid/libraries/sizeof_extern.c": {"return_code": 1}, "chapter_17/valid/sizeof/sizeof_basic_types.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_consts.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_expressions.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_array.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_derived_types.c": {"return_code": 0}, "chapter_17/valid/sizeof/simple.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_result_is_ulong.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_not_evaluated.c": {"return_code": 4}, "chapter_17/valid/void_pointer/array_of_pointers_to_void.c": {"return_code": 0}, "chapter_17/valid/void_pointer/conversion_by_assignment.c": {"return_code": 0}, "chapter_17/valid/void_pointer/explicit_cast.c": {"return_code": 0}, "chapter_17/valid/void_pointer/simple.c": {"return_code": 100}, "chapter_17/valid/void_pointer/memory_management_functions.c": {"return_code": 0}, "chapter_17/valid/void_pointer/common_pointer_type.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/addr_of_string.c": {"return_code": 0, "stdout": "Sample\tstring!\n\n"}, "chapter_16/valid/strings_as_lvalues/standard_library_calls.c": {"return_code": 0, "stdout": "Hello, World!\n"}, "chapter_16/valid/strings_as_lvalues/array_of_strings.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/cast_string_pointer.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/empty_string.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/pointer_operations.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/simple.c": {"return_code": 108}, "chapter_16/valid/strings_as_lvalues/adjacent_strings.c": {"return_code": 0, "stdout": "Hello, World\n"}, "chapter_16/valid/strings_as_lvalues/string_special_characters.c": {"return_code": 0, "stdout": "Hello\"world\nHello\\World\nLine\nbreak!\nTesting, 123.\n^@1 _\\]\n"}, "chapter_16/valid/strings_as_lvalues/strings_in_function_calls.c": {"return_code": 0}, "chapter_16/valid/libraries/return_char.c": {"return_code": 0}, "chapter_16/valid/libraries/char_arguments.c": {"return_code": 0}, "chapter_16/valid/libraries/global_char.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/array_init_special_chars.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/terminating_null_bytes.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/simple.c": {"return_code": 99}, "chapter_16/valid/strings_as_initializers/partial_initialize_via_string.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/adjacent_strings_in_initializer.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/transfer_by_eightbyte.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/literals_and_compound_initializers.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/write_to_array.c": {"return_code": 0, "stdout": "abc\nabx\nHello\nWorld\nJello\n"}, "chapter_16/valid/strings_as_initializers/test_alignment.c": {"return_code": 0}, "chapter_16/valid/char_constants/return_char_constant.c": {"return_code": 99}, "chapter_16/valid/char_constants/escape_sequences.c": {"return_code": 0}, "chapter_16/valid/char_constants/control_characters.c": {"return_code": 0}, "chapter_16/valid/char_constants/char_constant_operations.c": {"return_code": 0}, "chapter_16/valid/chars/partial_initialization.c": {"return_code": 0}, "chapter_16/valid/chars/convert_by_assignment.c": {"return_code": 0}, "chapter_16/valid/chars/type_specifiers.c": {"return_code": 0}, "chapter_16/valid/chars/push_arg_on_page_boundary.c": {"return_code": 1}, "chapter_16/valid/chars/integer_promotion.c": {"return_code": 0}, "chapter_16/valid/chars/chained_casts.c": {"return_code": 0}, "chapter_16/valid/chars/return_char.c": {"return_code": 0}, "chapter_16/valid/chars/char_arguments.c": {"return_code": 0}, "chapter_16/valid/chars/char_expressions.c": {"return_code": 0}, "chapter_16/valid/chars/access_through_char_pointer.c": {"return_code": 0}, "chapter_16/valid/chars/common_type.c": {"return_code": 0}, "chapter_16/valid/chars/static_initializers.c": {"return_code": 0}, "chapter_16/valid/chars/explicit_casts.c": {"return_code": 0}, "chapter_9/valid/arguments_in_registers/parameter_shadows_own_function.c": {"return_code": 2}, "chapter_9/valid/arguments_in_registers/expression_args.c": {"return_code": 2}, "chapter_9/valid/arguments_in_registers/single_arg.c": {"return_code": 6}, "chapter_9/valid/arguments_in_registers/hello_world.c": {"return_code": 0, "stdout": "Hello, World!\n"}, "chapter_9/valid/arguments_in_registers/parameter_shadows_function.c": {"return_code": 3}, "chapter_9/valid/arguments_in_registers/parameters_are_preserved.c": {"return_code": 1}, "chapter_9/valid/arguments_in_registers/forward_decl_multi_arg.c": {"return_code": 1}, "chapter_9/valid/arguments_in_registers/fibonacci.c": {"return_code": 8}, "chapter_9/valid/arguments_in_registers/param_shadows_local_var.c": {"return_code": 20}, "chapter_9/valid/no_arguments/function_shadows_variable.c": {"return_code": 11}, "chapter_9/valid/no_arguments/use_function_in_expression.c": {"return_code": 21}, "chapter_9/valid/no_arguments/no_return_value.c": {"return_code": 3}, "chapter_9/valid/no_arguments/multiple_declarations.c": {"return_code": 3}, "chapter_9/valid/no_arguments/precedence.c": {"return_code": 0}, "chapter_9/valid/no_arguments/forward_decl.c": {"return_code": 3}, "chapter_9/valid/no_arguments/variable_shadows_function.c": {"return_code": 7}, "chapter_9/valid/libraries/system_call.c": {"return_code": 0, "stdout": "H"}, "chapter_9/valid/libraries/many_args.c": {"return_code": 115}, "chapter_9/valid/libraries/addition.c": {"return_code": 3}, "chapter_9/valid/libraries/no_function_calls/division.c": {"return_code": 1}, "chapter_9/valid/libraries/no_function_calls/local_stack_variables.c": {"return_code": 100}, "chapter_9/valid/extra_credit/compound_assign_function_result.c": {"return_code": 1}, "chapter_9/valid/extra_credit/goto_label_multiple_functions.c": {"return_code": 5}, "chapter_9/valid/extra_credit/goto_shared_name.c": {"return_code": 1}, "chapter_9/valid/stack_arguments/call_putchar.c": {"return_code": 8, "stdout": "A"}, "chapter_9/valid/stack_arguments/lots_of_arguments.c": {"return_code": 1}, "chapter_9/valid/stack_arguments/stack_alignment.c": {"return_code": 1}, "chapter_9/valid/stack_arguments/test_for_memory_leaks.c": {"return_code": 1}, "chapter_12/valid/unsigned_expressions/logical.c": {"return_code": 0}, "chapter_12/valid/unsigned_expressions/arithmetic_wraparound.c": {"return_code": 1}, "chapter_12/valid/unsigned_expressions/arithmetic_ops.c": {"return_code": 0}, "chapter_12/valid/unsigned_expressions/comparisons.c": {"return_code": 0}, "chapter_12/valid/unsigned_expressions/simple.c": {"return_code": 1}, "chapter_12/valid/unsigned_expressions/static_variables.c": {"return_code": 1}, "chapter_12/valid/unsigned_expressions/locals.c": {"return_code": 0}, "chapter_12/valid/libraries/unsigned_args.c": {"return_code": 0}, "chapter_12/valid/libraries/unsigned_global_var.c": {"return_code": 1}, "chapter_12/valid/explicit_casts/same_size_conversion.c": {"return_code": 0}, "chapter_12/valid/explicit_casts/extension.c": {"return_code": 0}, "chapter_12/valid/explicit_casts/round_trip_casts.c": {"return_code": 0}, "chapter_12/valid/explicit_casts/chained_casts.c": {"return_code": 0}, "chapter_12/valid/explicit_casts/truncate.c": {"return_code": 0}, "chapter_12/valid/type_specifiers/signed_type_specifiers.c": {"return_code": 0}, "chapter_12/valid/type_specifiers/unsigned_type_specifiers.c": {"return_code": 0}, "chapter_12/valid/implicit_casts/convert_by_assignment.c": {"return_code": 0}, "chapter_12/valid/implicit_casts/promote_constants.c": {"return_code": 0}, "chapter_12/valid/implicit_casts/common_type.c": {"return_code": 0}, "chapter_12/valid/implicit_casts/static_initializers.c": {"return_code": 0}, "chapter_12/valid/extra_credit/switch_uint.c": {"return_code": 0}, "chapter_12/valid/extra_credit/compound_assign_uint.c": {"return_code": 1}, "chapter_12/valid/extra_credit/bitwise_unsigned_shift.c": {"return_code": 1}, "chapter_12/valid/extra_credit/bitwise_unsigned_ops.c": {"return_code": 1}, "chapter_5/valid/null_then_return.c": {"return_code": 0}, "chapter_5/valid/empty_function_body.c": {"return_code": 0}, "chapter_5/valid/short_circuit_or.c": {"return_code": 0}, "chapter_5/valid/assignment_in_initializer.c": {"return_code": 0}, "chapter_5/valid/non_short_circuit_or.c": {"return_code": 1}, "chapter_5/valid/null_statement.c": {"return_code": 0}, "chapter_5/valid/short_circuit_and_fail.c": {"return_code": 0}, "chapter_5/valid/local_var_missing_return.c": {"return_code": 0}, "chapter_5/valid/exp_then_declaration.c": {"return_code": 1}, "chapter_5/valid/add_variables.c": {"return_code": 3}, "chapter_5/valid/assign_val_in_initializer.c": {"return_code": 5}, "chapter_5/valid/assignment_lowest_precedence.c": {"return_code": 1}, "chapter_5/valid/allocate_temps_and_vars.c": {"return_code": 1}, "chapter_5/valid/use_assignment_result.c": {"return_code": 4}, "chapter_5/valid/use_val_in_own_initializer.c": {"return_code": 0}, "chapter_5/valid/unused_exp.c": {"return_code": 0}, "chapter_5/valid/return_var.c": {"return_code": 2}, "chapter_5/valid/mixed_precedence_assignment.c": {"return_code": 4}, "chapter_5/valid/assign.c": {"return_code": 2}, "chapter_5/valid/extra_credit/bitwise_shiftr_assign.c": {"return_code": 77}, "chapter_5/valid/extra_credit/bitwise_shiftl_variable.c": {"return_code": 24}, "chapter_5/valid/extra_credit/compound_bitwise_and.c": {"return_code": 2}, "chapter_5/valid/extra_credit/compound_minus.c": {"return_code": 2}, "chapter_5/valid/extra_credit/compound_multiply.c": {"return_code": 12}, "chapter_5/valid/extra_credit/compound_bitwise_xor.c": {"return_code": 2}, "chapter_5/valid/extra_credit/compound_bitwise_or.c": {"return_code": 31}, "chapter_5/valid/extra_credit/compound_assignment_chained.c": {"return_code": 4}, "chapter_5/valid/extra_credit/compound_divide.c": {"return_code": 2}, "chapter_5/valid/extra_credit/compound_bitwise_shiftr.c": {"return_code": 102}, "chapter_5/valid/extra_credit/compound_assignment_use_result.c": {"return_code": 8}, "chapter_5/valid/extra_credit/compound_bitwise_shiftl.c": {"return_code": 48}, "chapter_5/valid/extra_credit/compound_plus.c": {"return_code": 4}, "chapter_5/valid/extra_credit/compound_mod.c": {"return_code": 2}, "chapter_5/valid/extra_credit/bitwise_and_vars.c": {"return_code": 1}, "chapter_7/valid/declaration_only.c": {"return_code": 1}, "chapter_7/valid/assign_to_self_2.c": {"return_code": 3}, "chapter_7/valid/hidden_then_visible.c": {"return_code": 1}, "chapter_7/valid/hidden_variable.c": {"return_code": 1}, "chapter_7/valid/assign_to_self.c": {"return_code": 4}, "chapter_7/valid/inner_uninitialized.c": {"return_code": 4}, "chapter_7/valid/multiple_vars_same_name.c": {"return_code": 2}, "chapter_7/valid/use_in_inner_scope.c": {"return_code": 3}, "chapter_7/valid/empty_blocks.c": {"return_code": 30}, "chapter_7/valid/nested_if.c": {"return_code": 1}, "chapter_7/valid/similar_var_names.c": {"return_code": 28}, "chapter_7/valid/extra_credit/goto_before_declaration.c": {"return_code": 0}, "chapter_7/valid/extra_credit/compound_subtract_in_block.c": {"return_code": 1}, "chapter_7/valid/extra_credit/goto_inner_scope.c": {"return_code": 1}, "chapter_4/valid/le_true.c": {"return_code": 2}, "chapter_4/valid/ne_true.c": {"return_code": 1}, "chapter_4/valid/ge_false.c": {"return_code": 0}, "chapter_4/valid/not_zero.c": {"return_code": 1}, "chapter_4/valid/precedence_2.c": {"return_code": 0}, "chapter_4/valid/ge_true.c": {"return_code": 2}, "chapter_4/valid/eq_precedence.c": {"return_code": 1}, "chapter_4/valid/eq_false.c": {"return_code": 0}, "chapter_4/valid/or_short_circuit.c": {"return_code": 1}, "chapter_4/valid/not_sum.c": {"return_code": 1}, "chapter_4/valid/precedence_4.c": {"return_code": 1}, "chapter_4/valid/and_short_circuit.c": {"return_code": 0}, "chapter_4/valid/precedence_3.c": {"return_code": 0}, "chapter_4/valid/compare_arithmetic_results.c": {"return_code": 1}, "chapter_4/valid/and_false.c": {"return_code": 0}, "chapter_4/valid/precedence_5.c": {"return_code": 1}, "chapter_4/valid/associativity.c": {"return_code": 1}, "chapter_4/valid/gt_true.c": {"return_code": 1}, "chapter_4/valid/lt_false.c": {"return_code": 0}, "chapter_4/valid/or_true.c": {"return_code": 3}, "chapter_4/valid/or_false.c": {"return_code": 0}, "chapter_4/valid/eq_true.c": {"return_code": 1}, "chapter_4/valid/ne_false.c": {"return_code": 0}, "chapter_4/valid/multi_short_circuit.c": {"return_code": 0}, "chapter_4/valid/gt_false.c": {"return_code": 0}, "chapter_4/valid/operate_on_booleans.c": {"return_code": 0}, "chapter_4/valid/not.c": {"return_code": 0}, "chapter_4/valid/le_false.c": {"return_code": 0}, "chapter_4/valid/nested_ops.c": {"return_code": 0}, "chapter_4/valid/precedence.c": {"return_code": 1}, "chapter_4/valid/not_sum_2.c": {"return_code": 0}, "chapter_4/valid/and_true.c": {"return_code": 1}, "chapter_4/valid/lt_true.c": {"return_code": 1}, "chapter_4/valid/extra_credit/bitwise_precedence.c": {"return_code": 1}, "chapter_3/valid/mod.c": {"return_code": 0}, "chapter_3/valid/unop_add.c": {"return_code": 0}, "chapter_3/valid/associativity_3.c": {"return_code": 8}, "chapter_3/valid/mult.c": {"return_code": 6}, "chapter_3/valid/sub.c": {"return_code": 255}, "chapter_3/valid/div_neg.c": {"return_code": 254}, "chapter_3/valid/unop_parens.c": {"return_code": 253}, "chapter_3/valid/add.c": {"return_code": 3}, "chapter_3/valid/associativity.c": {"return_code": 252}, "chapter_3/valid/associativity_2.c": {"return_code": 1}, "chapter_3/valid/div.c": {"return_code": 2}, "chapter_3/valid/sub_neg.c": {"return_code": 3}, "chapter_3/valid/associativity_and_precedence.c": {"return_code": 10}, "chapter_3/valid/parens.c": {"return_code": 14}, "chapter_3/valid/precedence.c": {"return_code": 14}, "chapter_3/valid/extra_credit/bitwise_shiftr.c": {"return_code": 62}, "chapter_3/valid/extra_credit/bitwise_and.c": {"return_code": 1}, "chapter_3/valid/extra_credit/bitwise_shiftl.c": {"return_code": 140}, "chapter_3/valid/extra_credit/bitwise_or.c": {"return_code": 3}, "chapter_3/valid/extra_credit/bitwise_shift_precedence.c": {"return_code": 0}, "chapter_3/valid/extra_credit/bitwise_xor.c": {"return_code": 6}, "chapter_3/valid/extra_credit/bitwise_shift_associativity_2.c": {"return_code": 16}, "chapter_3/valid/extra_credit/bitwise_shift_associativity.c": {"return_code": 66}, "chapter_3/valid/extra_credit/bitwise_precedence.c": {"return_code": 21}, "chapter_11/valid/long_expressions/long_args.c": {"return_code": 0}, "chapter_11/valid/long_expressions/logical.c": {"return_code": 0}, "chapter_11/valid/long_expressions/type_specifiers.c": {"return_code": 0}, "chapter_11/valid/long_expressions/multi_op.c": {"return_code": 1}, "chapter_11/valid/long_expressions/large_constants.c": {"return_code": 0}, "chapter_11/valid/long_expressions/arithmetic_ops.c": {"return_code": 0}, "chapter_11/valid/long_expressions/return_long.c": {"return_code": 1}, "chapter_11/valid/long_expressions/comparisons.c": {"return_code": 0}, "chapter_11/valid/long_expressions/simple.c": {"return_code": 1}, "chapter_11/valid/long_expressions/static_long.c": {"return_code": 1}, "chapter_11/valid/long_expressions/long_and_int_locals.c": {"return_code": 0}, "chapter_11/valid/long_expressions/assign.c": {"return_code": 1}, "chapter_11/valid/libraries/long_args.c": {"return_code": 0}, "chapter_11/valid/libraries/maintain_stack_alignment.c": {"return_code": 12}, "chapter_11/valid/libraries/return_long.c": {"return_code": 1}, "chapter_11/valid/libraries/long_global_var.c": {"return_code": 0}, "chapter_11/valid/explicit_casts/truncate.c": {"return_code": 0}, "chapter_11/valid/explicit_casts/sign_extend.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/convert_by_assignment.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/common_type.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/long_constants.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/convert_function_arguments.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/convert_static_initializer.c": {"return_code": 0}, "chapter_11/valid/extra_credit/bitwise_long_op.c": {"return_code": 1}, "chapter_11/valid/extra_credit/compound_assign_to_int.c": {"return_code": 1}, "chapter_11/valid/extra_credit/compound_assign_to_long.c": {"return_code": 1}, "chapter_11/valid/extra_credit/switch_int.c": {"return_code": 1}, "chapter_11/valid/extra_credit/switch_long.c": {"return_code": 1}, "chapter_19/constant_folding/all_types/fold_truncate.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_cast_to_double.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_ulong.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_double.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_extensions_and_copies.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_long.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_uint.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_cast_from_double.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_unary.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_conditional_jump.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_binary.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_control_flow.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_exception.c": {"return_code": 0}, "chapter_19/unreachable_code_elimination/remove_useless_starting_label.c": {"return_code": 99}, "chapter_19/unreachable_code_elimination/dead_for_loop.c": {"return_code": 10}, "chapter_19/unreachable_code_elimination/keep_final_jump.c": {"return_code": 17}, "chapter_19/unreachable_code_elimination/remove_jump_keep_label.c": {"return_code": 10}, "chapter_19/unreachable_code_elimination/dead_branch_inside_loop.c": {"return_code": 19}, "chapter_19/unreachable_code_elimination/empty.c": {"return_code": 0}, "chapter_19/unreachable_code_elimination/infinite_loop.c": {"return_code": 11}, "chapter_19/unreachable_code_elimination/constant_if_else.c": {"return_code": 45}, "chapter_19/unreachable_code_elimination/dead_blocks_with_predecessors.c": {"return_code": 5}, "chapter_19/unreachable_code_elimination/remove_conditional_jumps.c": {"return_code": 1}, "chapter_19/unreachable_code_elimination/dead_after_return.c": {"return_code": 2}, "chapter_19/unreachable_code_elimination/empty_block.c": {"return_code": 1}, "chapter_19/unreachable_code_elimination/dead_after_if_else.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/pointer_arithmetic.c": {"return_code": 2}, "chapter_19/copy_propagation/all_types/store_doesnt_kill.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/propagate_into_type_conversions.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/redundant_double_copies.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/char_type_conversion.c": {"return_code": 1, "stdout": "CBA@"}, "chapter_19/copy_propagation/all_types/alias_analysis.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/copy_struct.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/redundant_struct_copies.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/propagate_null_pointer.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/propagate_all_types.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/funcall_kills_aliased.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/dont_propagate/static_are_aliased.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/dont_propagate/store_kills_aliased.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/dont_propagate/copy_to_offset.c": {"return_code": 3}, "chapter_19/copy_propagation/all_types/dont_propagate/dont_propagate_addr_of.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/dont_propagate/type_conversion.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/dont_propagate/zero_neg_zero_different.c": {"return_code": 1}, "chapter_19/copy_propagation/int_only/killed_then_redefined.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/different_paths_same_copy.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/multi_path_no_kill.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/redundant_copies.c": {"return_code": 20}, "chapter_19/copy_propagation/int_only/fig_19_8.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/propagate_into_complex_expressions.c": {"return_code": 1}, "chapter_19/copy_propagation/int_only/propagate_static.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/propagate_static_var.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/kill_and_add_copies.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/init_all_copies.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/propagate_params.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/nested_loops.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/constant_propagation.c": {"return_code": 6}, "chapter_19/copy_propagation/int_only/propagate_var.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/different_source_values_same_copy.c": {"return_code": 1}, "chapter_19/copy_propagation/int_only/dont_propagate/source_killed_on_one_path.c": {"return_code": 0, "stdout": "DA"}, "chapter_19/copy_propagation/int_only/dont_propagate/one_reaching_copy.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/dont_propagate/dest_killed.c": {"return_code": 4}, "chapter_19/copy_propagation/int_only/dont_propagate/no_copies_reach_entry.c": {"return_code": 4}, "chapter_19/copy_propagation/int_only/dont_propagate/listing_19_14.c": {"return_code": 101}, "chapter_19/copy_propagation/int_only/dont_propagate/add_all_blocks_to_worklist.c": {"return_code": 100}, "chapter_19/copy_propagation/int_only/dont_propagate/multi_values.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/dont_propagate/static_dst_killed.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/dont_propagate/static_src_killed.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/dont_propagate/source_killed.c": {"return_code": 0}, "chapter_19/dead_store_elimination/all_types/aliased_dead_at_exit.c": {"return_code": 1}, "chapter_19/dead_store_elimination/all_types/getaddr_doesnt_gen.c": {"return_code": 0}, "chapter_19/dead_store_elimination/all_types/copy_to_dead_struct.c": {"return_code": 4}, "chapter_19/dead_store_elimination/all_types/dont_elim/copytooffset_doesnt_kill.c": {"return_code": 101}, "chapter_19/dead_store_elimination/all_types/dont_elim/store_generates_dst.c": {"return_code": 4}, "chapter_19/dead_store_elimination/all_types/dont_elim/load_generates_pointer.c": {"return_code": 10}, "chapter_19/dead_store_elimination/all_types/dont_elim/load_through_pointer.c": {"return_code": 10}, "chapter_19/dead_store_elimination/all_types/dont_elim/pass_pointer_to_fun.c": {"return_code": 5}, "chapter_19/dead_store_elimination/all_types/dont_elim/never_kill_store.c": {"return_code": 4}, "chapter_19/dead_store_elimination/all_types/dont_elim/copyfromoffset_gen.c": {"return_code": 3}, "chapter_19/dead_store_elimination/int_only/fig_19_12.c": {"return_code": 9}, "chapter_19/dead_store_elimination/int_only/use_and_kill.c": {"return_code": 5}, "chapter_19/dead_store_elimination/int_only/dead_store_static_var.c": {"return_code": 1}, "chapter_19/dead_store_elimination/int_only/loop_dead_store.c": {"return_code": 51}, "chapter_19/dead_store_elimination/int_only/simple.c": {"return_code": 3}, "chapter_19/dead_store_elimination/int_only/elim_second_copy.c": {"return_code": 10}, "chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_at_exit.c": {"return_code": 1}, "chapter_19/dead_store_elimination/int_only/dont_elim/used_one_path.c": {"return_code": 40}, "chapter_19/dead_store_elimination/int_only/dont_elim/dont_remove_funcall.c": {"return_code": 0, "stdout": "C"}, "chapter_19/dead_store_elimination/int_only/dont_elim/add_all_to_worklist.c": {"return_code": 0, "stdout": "L"}, "chapter_19/dead_store_elimination/int_only/dont_elim/loop.c": {"return_code": 54}, "chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_fun.c": {"return_code": 5}, "chapter_19/whole_pipeline/all_types/unsigned_wraparound.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/unsigned_compare.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/signed_unsigned_conversion.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/alias_analysis_change.c": {"return_code": 0}, "chapter_19/whole_pipeline/all_types/not_char.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/const_fold_sign_extend.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/char_round_trip.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/const_fold_sign_extend_2.c": {"return_code": 1}, "chapter_19/whole_pipeline/int_only/dead_condition.c": {"return_code": 10}, "chapter_19/whole_pipeline/int_only/elim_and_copy_prop.c": {"return_code": 10}, "chapter_19/whole_pipeline/int_only/remainder_test.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/mixed_ints.c": {"return_code": 9}, "chapter_20/all_types/no_coalescing/dbl_trivially_colorable.c": {"return_code": 3}, "chapter_20/all_types/no_coalescing/spill_movz_dst.c": {"return_code": 29}, "chapter_20/all_types/no_coalescing/push_xmm.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/dbl_fun_call.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/stack_alignment.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/track_dbl_arg_registers.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/fourteen_pseudos_interfere.c": {"return_code": 0}, "chapter_20/all_types/no_coalescing/div_interference.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/test_spilling_dbls.c": {"return_code": 3}, "chapter_20/all_types/no_coalescing/store_pointer_in_register.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/same_instr_interference.c": {"return_code": 6}, "chapter_20/int_only/no_coalescing/spills_rewrites_compare.c": {"return_code": 3}, "chapter_20/int_only/no_coalescing/copy_and_separate_interference.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/spills_and_rewrites.c": {"return_code": 23}, "chapter_20/int_only/no_coalescing/cmp_liveness.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/rewrite_large_multiply.c": {"return_code": 58}, "chapter_20/int_only/no_coalescing/spill_callee_saved.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/test_spill_metric.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/unary_interference.c": {"return_code": 10}, "chapter_20/int_only/no_coalescing/optimistic_coloring.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/track_arg_registers.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/many_pseudos_fewer_conflicts.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/same_instr_no_interference.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/copy_no_interference.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/force_spill.c": {"return_code": 9}, "chapter_20/int_only/no_coalescing/callee_saved_stack_alignment.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/idiv_interference.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/preserve_across_fun_call.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/use_all_hardregs.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/test_spill_metric_2.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/loop.c": {"return_code": 6}, "chapter_20/int_only/no_coalescing/trivially_colorable.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/cdq_interference.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/cdq_generates_ax.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/callee_saved_live_at_exit.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/coalesce_prevents_spill.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/george_coalesce.c": {"return_code": 1}, "chapter_20/int_only/with_coalescing/unary_generates_dst.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/briggs_coalesce.c": {"return_code": 2}, "chapter_20/int_only/with_coalescing/bin_generates_dst.c": {"return_code": 187}, "chapter_20/int_only/with_coalescing/briggs_coalesce_tmps.c": {"return_code": 1}, "chapter_20/int_only/with_coalescing/cmp_generates_operands.c": {"return_code": 1}, "chapter_20/int_only/with_coalescing/funcall_generates_args.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/eax_live_at_exit.c": {"return_code": 1}} \ No newline at end of file +{"chapter_6/valid/rh_assignment.c": {"return_code": 1}, "chapter_6/valid/if_nested_2.c": {"return_code": 2}, "chapter_6/valid/if_nested_3.c": {"return_code": 3}, "chapter_6/valid/nested_ternary.c": {"return_code": 7}, "chapter_6/valid/binary_false_condition.c": {"return_code": 0}, "chapter_6/valid/else.c": {"return_code": 2}, "chapter_6/valid/nested_ternary_2.c": {"return_code": 15}, "chapter_6/valid/ternary_short_circuit.c": {"return_code": 1}, "chapter_6/valid/multiple_if.c": {"return_code": 8}, "chapter_6/valid/if_null_body.c": {"return_code": 1}, "chapter_6/valid/ternary_rh_binop.c": {"return_code": 1}, "chapter_6/valid/ternary_middle_assignment.c": {"return_code": 2}, "chapter_6/valid/if_nested_4.c": {"return_code": 4}, "chapter_6/valid/ternary_middle_binop.c": {"return_code": 1}, "chapter_6/valid/if_taken.c": {"return_code": 1}, "chapter_6/valid/if_not_taken.c": {"return_code": 0}, "chapter_6/valid/if_nested_5.c": {"return_code": 1}, "chapter_6/valid/assign_ternary.c": {"return_code": 2}, "chapter_6/valid/ternary.c": {"return_code": 4}, "chapter_6/valid/if_nested.c": {"return_code": 1}, "chapter_6/valid/ternary_short_circuit_2.c": {"return_code": 2}, "chapter_6/valid/binary_condition.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_label_and_var.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_label_main_2.c": {"return_code": 0}, "chapter_6/valid/extra_credit/bitwise_ternary.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_label_main.c": {"return_code": 0}, "chapter_6/valid/extra_credit/goto_nested_label.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_backwards.c": {"return_code": 5}, "chapter_6/valid/extra_credit/goto_label.c": {"return_code": 1}, "chapter_6/valid/extra_credit/compound_if_expression.c": {"return_code": 1}, "chapter_6/valid/extra_credit/goto_after_declaration.c": {"return_code": 1}, "chapter_8/valid/for.c": {"return_code": 16}, "chapter_8/valid/continue.c": {"return_code": 1}, "chapter_8/valid/multi_continue_same_loop.c": {"return_code": 1}, "chapter_8/valid/for_absent_post.c": {"return_code": 0}, "chapter_8/valid/null_for_header.c": {"return_code": 4}, "chapter_8/valid/nested_loop.c": {"return_code": 1}, "chapter_8/valid/nested_break.c": {"return_code": 250}, "chapter_8/valid/do_while.c": {"return_code": 16}, "chapter_8/valid/for_absent_condition.c": {"return_code": 0}, "chapter_8/valid/do_while_break_immediate.c": {"return_code": 10}, "chapter_8/valid/continue_empty_post.c": {"return_code": 30}, "chapter_8/valid/nested_continue.c": {"return_code": 24}, "chapter_8/valid/break.c": {"return_code": 1}, "chapter_8/valid/for_nested_shadow.c": {"return_code": 1}, "chapter_8/valid/empty_expression.c": {"return_code": 0}, "chapter_8/valid/multi_break.c": {"return_code": 1}, "chapter_8/valid/for_decl.c": {"return_code": 101}, "chapter_8/valid/for_shadow.c": {"return_code": 1}, "chapter_8/valid/break_immediate.c": {"return_code": 1}, "chapter_8/valid/while.c": {"return_code": 6}, "chapter_8/valid/empty_loop_body.c": {"return_code": 252}, "chapter_8/valid/extra_credit/switch_fallthrough.c": {"return_code": 4}, "chapter_8/valid/extra_credit/compound_assignment_for_loop.c": {"return_code": 10}, "chapter_8/valid/extra_credit/switch_break.c": {"return_code": 5}, "chapter_8/valid/extra_credit/switch_default.c": {"return_code": 22}, "chapter_8/valid/extra_credit/switch_default_fallthrough.c": {"return_code": 0}, "chapter_8/valid/extra_credit/switch_with_loop.c": {"return_code": 123}, "chapter_8/valid/extra_credit/switch_assign_in_body.c": {"return_code": 3}, "chapter_8/valid/extra_credit/switch_in_loop.c": {"return_code": 1}, "chapter_8/valid/extra_credit/switch_no_case.c": {"return_code": 4}, "chapter_8/valid/extra_credit/switch_nested_case.c": {"return_code": 3}, "chapter_8/valid/extra_credit/switch_nested_not_taken.c": {"return_code": 2}, "chapter_8/valid/extra_credit/switch_decl.c": {"return_code": 7}, "chapter_8/valid/extra_credit/switch_with_continue.c": {"return_code": 5}, "chapter_8/valid/extra_credit/switch_empty.c": {"return_code": 10}, "chapter_8/valid/extra_credit/goto_loop_body.c": {"return_code": 1}, "chapter_8/valid/extra_credit/goto_bypass_condition.c": {"return_code": 10}, "chapter_8/valid/extra_credit/switch_nested_switch.c": {"return_code": 1}, "chapter_8/valid/extra_credit/switch_block.c": {"return_code": 1}, "chapter_8/valid/extra_credit/switch_default_not_last.c": {"return_code": 0}, "chapter_8/valid/extra_credit/switch_assign_in_condition.c": {"return_code": 2}, "chapter_8/valid/extra_credit/switch.c": {"return_code": 3}, "chapter_8/valid/extra_credit/switch_goto_mid_case.c": {"return_code": 1}, "chapter_14/valid/libraries/static_pointer.c": {"return_code": 0}, "chapter_14/valid/libraries/global_pointer.c": {"return_code": 1}, "chapter_14/valid/function_calls/address_of_argument.c": {"return_code": 0}, "chapter_14/valid/function_calls/update_value_through_pointer_parameter.c": {"return_code": 0}, "chapter_14/valid/function_calls/return_pointer.c": {"return_code": 0}, "chapter_14/valid/extra_credit/incr_through_pointer.c": {"return_code": 11}, "chapter_14/valid/extra_credit/compound_assign_through_pointer.c": {"return_code": 1}, "chapter_14/valid/declarators/declare_pointer_in_for_loop.c": {"return_code": 5}, "chapter_14/valid/declarators/abstract_declarators.c": {"return_code": 0}, "chapter_14/valid/declarators/declarators.c": {"return_code": 0}, "chapter_14/valid/dereference/static_var_indirection.c": {"return_code": 0}, "chapter_14/valid/dereference/multilevel_indirection.c": {"return_code": 0}, "chapter_14/valid/dereference/read_through_pointers.c": {"return_code": 0}, "chapter_14/valid/dereference/update_through_pointers.c": {"return_code": 0}, "chapter_14/valid/dereference/address_of_dereference.c": {"return_code": 0}, "chapter_14/valid/dereference/simple.c": {"return_code": 3}, "chapter_14/valid/dereference/dereference_expression_result.c": {"return_code": 0}, "chapter_14/valid/casts/cast_between_pointer_types.c": {"return_code": 0}, "chapter_14/valid/casts/pointer_int_casts.c": {"return_code": 0}, "chapter_14/valid/casts/null_pointer_conversion.c": {"return_code": 0}, "chapter_14/valid/comparisons/compare_pointers.c": {"return_code": 0}, "chapter_14/valid/comparisons/pointers_as_conditions.c": {"return_code": 0}, "chapter_14/valid/comparisons/compare_to_null.c": {"return_code": 0}, "chapter_10/valid/static_then_extern.c": {"return_code": 3}, "chapter_10/valid/push_arg_on_page_boundary.c": {"return_code": 1}, "chapter_10/valid/static_local_multiple_scopes.c": {"return_code": 0, "stdout": "Aa\nBb\nCc\nDd\nEe\nFf\nGg\nHh\nIi\nJj\nKk\nLl\nMm\nNn\nOo\nPp\nQq\nRr\nSs\nTt\nUu\nVv\nWw\nXx\nYy\nZz\n"}, "chapter_10/valid/tentative_definition.c": {"return_code": 5}, "chapter_10/valid/static_variables_in_expressions.c": {"return_code": 0}, "chapter_10/valid/static_recursive_call.c": {"return_code": 0, "stdout": "ABCDEFGHIJKLMNOPQRSTUVWXYZ"}, "chapter_10/valid/shadow_static_local_var.c": {"return_code": 0}, "chapter_10/valid/multiple_static_local.c": {"return_code": 29}, "chapter_10/valid/multiple_static_file_scope_vars.c": {"return_code": 4}, "chapter_10/valid/static_local_uninitialized.c": {"return_code": 4}, "chapter_10/valid/type_before_storage_class.c": {"return_code": 7}, "chapter_10/valid/extern_block_scope_variable.c": {"return_code": 3}, "chapter_10/valid/distinct_local_and_extern.c": {"return_code": 7}, "chapter_10/valid/libraries/internal_hides_external_linkage.c": {"return_code": 0}, "chapter_10/valid/libraries/external_tentative_var.c": {"return_code": 0}, "chapter_10/valid/libraries/external_linkage_function.c": {"return_code": 0}, "chapter_10/valid/libraries/external_variable.c": {"return_code": 0}, "chapter_10/valid/libraries/internal_linkage_var.c": {"return_code": 0}, "chapter_10/valid/libraries/external_var_scoping.c": {"return_code": 0}, "chapter_10/valid/libraries/internal_linkage_function.c": {"return_code": 0}, "chapter_10/valid/extra_credit/goto_skip_static_initializer.c": {"return_code": 10}, "chapter_2/valid/neg.c": {"return_code": 251}, "chapter_2/valid/negate_int_max.c": {"return_code": 1}, "chapter_2/valid/redundant_parens.c": {"return_code": 246}, "chapter_2/valid/neg_zero.c": {"return_code": 0}, "chapter_2/valid/bitwise_int_min.c": {"return_code": 254}, "chapter_2/valid/bitwise_zero.c": {"return_code": 255}, "chapter_2/valid/parens_3.c": {"return_code": 4}, "chapter_2/valid/parens_2.c": {"return_code": 253}, "chapter_2/valid/bitwise.c": {"return_code": 243}, "chapter_2/valid/nested_ops_2.c": {"return_code": 1}, "chapter_2/valid/nested_ops.c": {"return_code": 2}, "chapter_2/valid/parens.c": {"return_code": 254}, "chapter_1/valid/return_0.c": {"return_code": 0}, "chapter_1/valid/newlines.c": {"return_code": 0}, "chapter_1/valid/return_2.c": {"return_code": 2}, "chapter_1/valid/multi_digit.c": {"return_code": 100}, "chapter_1/valid/tabs.c": {"return_code": 0}, "chapter_1/valid/spaces.c": {"return_code": 0}, "chapter_1/valid/no_newlines.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/logical.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/arithmetic_ops.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/static_initialized_double.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/comparisons.c": {"return_code": 0}, "chapter_13/valid/floating_expressions/simple.c": {"return_code": 1}, "chapter_13/valid/floating_expressions/loop_controlling_expression.c": {"return_code": 100}, "chapter_13/valid/libraries/double_parameters.c": {"return_code": 0}, "chapter_13/valid/libraries/use_arg_after_fun_call.c": {"return_code": 4}, "chapter_13/valid/libraries/double_and_int_params_recursive.c": {"return_code": 0}, "chapter_13/valid/libraries/extern_double.c": {"return_code": 1}, "chapter_13/valid/libraries/double_params_and_result.c": {"return_code": 1}, "chapter_13/valid/explicit_casts/cvttsd2i_rewrite.c": {"return_code": 0}, "chapter_13/valid/explicit_casts/double_to_signed.c": {"return_code": 0}, "chapter_13/valid/explicit_casts/unsigned_to_double.c": {"return_code": 0}, "chapter_13/valid/explicit_casts/signed_to_double.c": {"return_code": 0}, "chapter_13/valid/explicit_casts/double_to_unsigned.c": {"return_code": 0}, "chapter_13/valid/implicit_casts/convert_for_assignment.c": {"return_code": 0}, "chapter_13/valid/implicit_casts/common_type.c": {"return_code": 0}, "chapter_13/valid/implicit_casts/static_initializers.c": {"return_code": 0}, "chapter_13/valid/implicit_casts/complex_arithmetic_common_type.c": {"return_code": 1}, "chapter_13/valid/constants/round_constants.c": {"return_code": 0}, "chapter_13/valid/constants/constant_doubles.c": {"return_code": 0}, "chapter_13/valid/special_values/subnormal_not_zero.c": {"return_code": 0}, "chapter_13/valid/special_values/negative_zero.c": {"return_code": 0}, "chapter_13/valid/special_values/infinity.c": {"return_code": 0}, "chapter_13/valid/function_calls/double_parameters.c": {"return_code": 0}, "chapter_13/valid/function_calls/double_and_int_parameters.c": {"return_code": 0}, "chapter_13/valid/function_calls/standard_library_call.c": {"return_code": 0}, "chapter_13/valid/function_calls/use_arg_after_fun_call.c": {"return_code": 4}, "chapter_13/valid/function_calls/return_double.c": {"return_code": 1}, "chapter_13/valid/function_calls/double_and_int_params_recursive.c": {"return_code": 0}, "chapter_13/valid/extra_credit/compound_assign.c": {"return_code": 1}, "chapter_13/valid/extra_credit/nan.c": {"return_code": 0}, "chapter_13/valid/extra_credit/compound_assign_implicit_cast.c": {"return_code": 1}, "chapter_18/valid/params_and_returns/temporary_lifetime.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/ignore_retval.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/return_space_overlap.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/return_big_struct_on_page_boundary.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/simple.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/return_struct_on_page_boundary.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/return_incomplete_type.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/stack_clobber.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/libraries/return_calling_conventions.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/libraries/missing_retval.c": {"return_code": 1}, "chapter_18/valid/params_and_returns/libraries/access_retval_members.c": {"return_code": 0}, "chapter_18/valid/params_and_returns/libraries/retval_struct_sizes.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/semantic_analysis/resolve_tags.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/semantic_analysis/namespaces.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/semantic_analysis/incomplete_structs.c": {"return_code": 0, "stdout": "I'm a struct!\n"}, "chapter_18/valid/no_structure_parameters/semantic_analysis/cast_struct_to_void.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/global_struct.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/param_struct_pointer.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/return_struct_pointer.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/opaque_struct.c": {"return_code": 0, "stdout": "new struct\nstatic struct\nglobal struct\n"}, "chapter_18/valid/no_structure_parameters/libraries/array_of_structs.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/initializers/auto_struct_initializers.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/initializers/static_struct_initializers.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/initializers/nested_static_struct_initializers.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/libraries/initializers/nested_auto_struct_initializers.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/smoke_tests/static_vs_auto.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/smoke_tests/simple.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/size_and_offset_calculations/member_offsets.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/size_and_offset_calculations/sizeof_exps.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/size_and_offset_calculations/sizeof_type.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/scalar_member_access/arrow.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/scalar_member_access/linked_list.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/scalar_member_access/static_structs.c": {"return_code": 0, "stdout": "zero\nmn\nop\nwx\nyz\nBCD\nCDE\nDEF\nEFG\nbcd\ncde\n"}, "chapter_18/valid/no_structure_parameters/scalar_member_access/nested_struct.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/scalar_member_access/dot.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/parse_and_lex/postfix_precedence.c": {"return_code": 1}, "chapter_18/valid/no_structure_parameters/parse_and_lex/trailing_comma.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/parse_and_lex/space_around_struct_member.c": {"return_code": 1}, "chapter_18/valid/no_structure_parameters/parse_and_lex/struct_member_looks_like_const.c": {"return_code": 3}, "chapter_18/valid/no_structure_parameters/struct_copy/copy_struct_through_pointer.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/struct_copy/copy_struct_with_arrow_operator.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/struct_copy/copy_struct.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/struct_copy/stack_clobber.c": {"return_code": 0}, "chapter_18/valid/no_structure_parameters/struct_copy/copy_struct_with_dot_operator.c": {"return_code": 0}, "chapter_18/valid/parameters/pass_args_on_page_boundary.c": {"return_code": 0}, "chapter_18/valid/parameters/incomplete_param_type.c": {"return_code": 3}, "chapter_18/valid/parameters/simple.c": {"return_code": 0}, "chapter_18/valid/parameters/stack_clobber.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/param_calling_conventions.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/struct_sizes.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/pass_struct.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/modify_param.c": {"return_code": 0}, "chapter_18/valid/parameters/libraries/classify_params.c": {"return_code": 0}, "chapter_15/valid/initialization/automatic.c": {"return_code": 0}, "chapter_15/valid/initialization/static.c": {"return_code": 0}, "chapter_15/valid/initialization/trailing_comma_initializer.c": {"return_code": 3}, "chapter_15/valid/initialization/automatic_nested.c": {"return_code": 0}, "chapter_15/valid/initialization/static_nested.c": {"return_code": 0}, "chapter_15/valid/libraries/set_array_val.c": {"return_code": 0}, "chapter_15/valid/libraries/return_pointer_to_array.c": {"return_code": 0}, "chapter_15/valid/libraries/global_array.c": {"return_code": 0}, "chapter_15/valid/subscripting/subscript_nested.c": {"return_code": 0}, "chapter_15/valid/subscripting/subscript_pointer.c": {"return_code": 0}, "chapter_15/valid/subscripting/array_of_pointers_to_arrays.c": {"return_code": 0}, "chapter_15/valid/subscripting/simple_subscripts.c": {"return_code": 0}, "chapter_15/valid/subscripting/simple.c": {"return_code": 3}, "chapter_15/valid/subscripting/complex_operands.c": {"return_code": 0}, "chapter_15/valid/subscripting/addition_subscript_equivalence.c": {"return_code": 0}, "chapter_15/valid/subscripting/subscript_precedence.c": {"return_code": 1}, "chapter_15/valid/allocation/test_alignment.c": {"return_code": 0}, "chapter_15/valid/pointer_arithmetic/pointer_add.c": {"return_code": 0}, "chapter_15/valid/pointer_arithmetic/add_dereference_and_assign.c": {"return_code": 0}, "chapter_15/valid/pointer_arithmetic/pointer_diff.c": {"return_code": 0}, "chapter_15/valid/pointer_arithmetic/compare.c": {"return_code": 0}, "chapter_15/valid/extra_credit/incr_ptr.c": {"return_code": 1}, "chapter_15/valid/declarators/big_array.c": {"return_code": 0}, "chapter_15/valid/declarators/equivalent_declarators.c": {"return_code": 0}, "chapter_15/valid/declarators/return_nested_array.c": {"return_code": 0}, "chapter_15/valid/declarators/array_as_argument.c": {"return_code": 0}, "chapter_15/valid/declarators/for_loop_array.c": {"return_code": 0}, "chapter_15/valid/casts/multi_dim_casts.c": {"return_code": 0}, "chapter_15/valid/casts/implicit_and_explicit_conversions.c": {"return_code": 0}, "chapter_15/valid/casts/cast_array_of_pointers.c": {"return_code": 1}, "chapter_17/valid/void/cast_to_void.c": {"return_code": 12}, "chapter_17/valid/void/void_function.c": {"return_code": 0}, "chapter_17/valid/void/void_for_loop.c": {"return_code": 0, "stdout": "ZYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYZZYXWVUTSRQPONMLKJIHGFEDCBA"}, "chapter_17/valid/void/ternary.c": {"return_code": 0}, "chapter_17/valid/libraries/pass_alloced_memory.c": {"return_code": 0}, "chapter_17/valid/libraries/test_for_memory_leaks.c": {"return_code": 0}, "chapter_17/valid/libraries/sizeof_extern.c": {"return_code": 1}, "chapter_17/valid/sizeof/sizeof_basic_types.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_consts.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_expressions.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_array.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_derived_types.c": {"return_code": 0}, "chapter_17/valid/sizeof/simple.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_result_is_ulong.c": {"return_code": 0}, "chapter_17/valid/sizeof/sizeof_not_evaluated.c": {"return_code": 4}, "chapter_17/valid/void_pointer/array_of_pointers_to_void.c": {"return_code": 0}, "chapter_17/valid/void_pointer/conversion_by_assignment.c": {"return_code": 0}, "chapter_17/valid/void_pointer/explicit_cast.c": {"return_code": 0}, "chapter_17/valid/void_pointer/simple.c": {"return_code": 100}, "chapter_17/valid/void_pointer/memory_management_functions.c": {"return_code": 0}, "chapter_17/valid/void_pointer/common_pointer_type.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/addr_of_string.c": {"return_code": 0, "stdout": "Sample\tstring!\n\n"}, "chapter_16/valid/strings_as_lvalues/standard_library_calls.c": {"return_code": 0, "stdout": "Hello, World!\n"}, "chapter_16/valid/strings_as_lvalues/array_of_strings.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/cast_string_pointer.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/empty_string.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/pointer_operations.c": {"return_code": 0}, "chapter_16/valid/strings_as_lvalues/simple.c": {"return_code": 108}, "chapter_16/valid/strings_as_lvalues/adjacent_strings.c": {"return_code": 0, "stdout": "Hello, World\n"}, "chapter_16/valid/strings_as_lvalues/string_special_characters.c": {"return_code": 0, "stdout": "Hello\"world\nHello\\World\nLine\nbreak!\nTesting, 123.\n^@1 _\\]\n"}, "chapter_16/valid/strings_as_lvalues/strings_in_function_calls.c": {"return_code": 0}, "chapter_16/valid/libraries/return_char.c": {"return_code": 0}, "chapter_16/valid/libraries/char_arguments.c": {"return_code": 0}, "chapter_16/valid/libraries/global_char.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/array_init_special_chars.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/terminating_null_bytes.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/simple.c": {"return_code": 99}, "chapter_16/valid/strings_as_initializers/partial_initialize_via_string.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/adjacent_strings_in_initializer.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/transfer_by_eightbyte.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/literals_and_compound_initializers.c": {"return_code": 0}, "chapter_16/valid/strings_as_initializers/write_to_array.c": {"return_code": 0, "stdout": "abc\nabx\nHello\nWorld\nJello\n"}, "chapter_16/valid/strings_as_initializers/test_alignment.c": {"return_code": 0}, "chapter_16/valid/char_constants/return_char_constant.c": {"return_code": 99}, "chapter_16/valid/char_constants/escape_sequences.c": {"return_code": 0}, "chapter_16/valid/char_constants/control_characters.c": {"return_code": 0}, "chapter_16/valid/char_constants/char_constant_operations.c": {"return_code": 0}, "chapter_16/valid/chars/partial_initialization.c": {"return_code": 0}, "chapter_16/valid/chars/convert_by_assignment.c": {"return_code": 0}, "chapter_16/valid/chars/type_specifiers.c": {"return_code": 0}, "chapter_16/valid/chars/push_arg_on_page_boundary.c": {"return_code": 1}, "chapter_16/valid/chars/integer_promotion.c": {"return_code": 0}, "chapter_16/valid/chars/chained_casts.c": {"return_code": 0}, "chapter_16/valid/chars/return_char.c": {"return_code": 0}, "chapter_16/valid/chars/char_arguments.c": {"return_code": 0}, "chapter_16/valid/chars/char_expressions.c": {"return_code": 0}, "chapter_16/valid/chars/access_through_char_pointer.c": {"return_code": 0}, "chapter_16/valid/chars/common_type.c": {"return_code": 0}, "chapter_16/valid/chars/static_initializers.c": {"return_code": 0}, "chapter_16/valid/chars/explicit_casts.c": {"return_code": 0}, "chapter_9/valid/arguments_in_registers/parameter_shadows_own_function.c": {"return_code": 2}, "chapter_9/valid/arguments_in_registers/expression_args.c": {"return_code": 2}, "chapter_9/valid/arguments_in_registers/single_arg.c": {"return_code": 6}, "chapter_9/valid/arguments_in_registers/hello_world.c": {"return_code": 0, "stdout": "Hello, World!\n"}, "chapter_9/valid/arguments_in_registers/parameter_shadows_function.c": {"return_code": 3}, "chapter_9/valid/arguments_in_registers/parameters_are_preserved.c": {"return_code": 1}, "chapter_9/valid/arguments_in_registers/forward_decl_multi_arg.c": {"return_code": 1}, "chapter_9/valid/arguments_in_registers/fibonacci.c": {"return_code": 8}, "chapter_9/valid/arguments_in_registers/param_shadows_local_var.c": {"return_code": 20}, "chapter_9/valid/no_arguments/function_shadows_variable.c": {"return_code": 11}, "chapter_9/valid/no_arguments/use_function_in_expression.c": {"return_code": 21}, "chapter_9/valid/no_arguments/no_return_value.c": {"return_code": 3}, "chapter_9/valid/no_arguments/multiple_declarations.c": {"return_code": 3}, "chapter_9/valid/no_arguments/precedence.c": {"return_code": 0}, "chapter_9/valid/no_arguments/forward_decl.c": {"return_code": 3}, "chapter_9/valid/no_arguments/variable_shadows_function.c": {"return_code": 7}, "chapter_9/valid/libraries/system_call.c": {"return_code": 0, "stdout": "H"}, "chapter_9/valid/libraries/many_args.c": {"return_code": 115}, "chapter_9/valid/libraries/addition.c": {"return_code": 3}, "chapter_9/valid/libraries/no_function_calls/division.c": {"return_code": 1}, "chapter_9/valid/libraries/no_function_calls/local_stack_variables.c": {"return_code": 100}, "chapter_9/valid/extra_credit/compound_assign_function_result.c": {"return_code": 1}, "chapter_9/valid/extra_credit/goto_label_multiple_functions.c": {"return_code": 5}, "chapter_9/valid/extra_credit/goto_shared_name.c": {"return_code": 1}, "chapter_9/valid/stack_arguments/call_putchar.c": {"return_code": 8, "stdout": "A"}, "chapter_9/valid/stack_arguments/lots_of_arguments.c": {"return_code": 1}, "chapter_9/valid/stack_arguments/stack_alignment.c": {"return_code": 1}, "chapter_9/valid/stack_arguments/test_for_memory_leaks.c": {"return_code": 1}, "chapter_12/valid/unsigned_expressions/logical.c": {"return_code": 0}, "chapter_12/valid/unsigned_expressions/arithmetic_wraparound.c": {"return_code": 1}, "chapter_12/valid/unsigned_expressions/arithmetic_ops.c": {"return_code": 0}, "chapter_12/valid/unsigned_expressions/comparisons.c": {"return_code": 0}, "chapter_12/valid/unsigned_expressions/simple.c": {"return_code": 1}, "chapter_12/valid/unsigned_expressions/static_variables.c": {"return_code": 1}, "chapter_12/valid/unsigned_expressions/locals.c": {"return_code": 0}, "chapter_12/valid/libraries/unsigned_args.c": {"return_code": 0}, "chapter_12/valid/libraries/unsigned_global_var.c": {"return_code": 1}, "chapter_12/valid/explicit_casts/same_size_conversion.c": {"return_code": 0}, "chapter_12/valid/explicit_casts/extension.c": {"return_code": 0}, "chapter_12/valid/explicit_casts/round_trip_casts.c": {"return_code": 0}, "chapter_12/valid/explicit_casts/chained_casts.c": {"return_code": 0}, "chapter_12/valid/explicit_casts/truncate.c": {"return_code": 0}, "chapter_12/valid/type_specifiers/signed_type_specifiers.c": {"return_code": 0}, "chapter_12/valid/type_specifiers/unsigned_type_specifiers.c": {"return_code": 0}, "chapter_12/valid/implicit_casts/convert_by_assignment.c": {"return_code": 0}, "chapter_12/valid/implicit_casts/promote_constants.c": {"return_code": 0}, "chapter_12/valid/implicit_casts/common_type.c": {"return_code": 0}, "chapter_12/valid/implicit_casts/static_initializers.c": {"return_code": 0}, "chapter_12/valid/extra_credit/switch_uint.c": {"return_code": 0}, "chapter_12/valid/extra_credit/compound_assign_uint.c": {"return_code": 1}, "chapter_12/valid/extra_credit/bitwise_unsigned_shift.c": {"return_code": 1}, "chapter_12/valid/extra_credit/bitwise_unsigned_ops.c": {"return_code": 1}, "chapter_5/valid/null_then_return.c": {"return_code": 0}, "chapter_5/valid/empty_function_body.c": {"return_code": 0}, "chapter_5/valid/short_circuit_or.c": {"return_code": 0}, "chapter_5/valid/assignment_in_initializer.c": {"return_code": 0}, "chapter_5/valid/non_short_circuit_or.c": {"return_code": 1}, "chapter_5/valid/null_statement.c": {"return_code": 0}, "chapter_5/valid/short_circuit_and_fail.c": {"return_code": 0}, "chapter_5/valid/local_var_missing_return.c": {"return_code": 0}, "chapter_5/valid/exp_then_declaration.c": {"return_code": 1}, "chapter_5/valid/add_variables.c": {"return_code": 3}, "chapter_5/valid/assign_val_in_initializer.c": {"return_code": 5}, "chapter_5/valid/assignment_lowest_precedence.c": {"return_code": 1}, "chapter_5/valid/allocate_temps_and_vars.c": {"return_code": 1}, "chapter_5/valid/use_assignment_result.c": {"return_code": 4}, "chapter_5/valid/use_val_in_own_initializer.c": {"return_code": 0}, "chapter_5/valid/unused_exp.c": {"return_code": 0}, "chapter_5/valid/return_var.c": {"return_code": 2}, "chapter_5/valid/mixed_precedence_assignment.c": {"return_code": 4}, "chapter_5/valid/assign.c": {"return_code": 2}, "chapter_5/valid/extra_credit/bitwise_shiftr_assign.c": {"return_code": 77}, "chapter_5/valid/extra_credit/bitwise_shiftl_variable.c": {"return_code": 24}, "chapter_5/valid/extra_credit/compound_bitwise_and.c": {"return_code": 2}, "chapter_5/valid/extra_credit/compound_minus.c": {"return_code": 2}, "chapter_5/valid/extra_credit/compound_multiply.c": {"return_code": 12}, "chapter_5/valid/extra_credit/compound_bitwise_xor.c": {"return_code": 2}, "chapter_5/valid/extra_credit/compound_bitwise_or.c": {"return_code": 31}, "chapter_5/valid/extra_credit/compound_assignment_chained.c": {"return_code": 4}, "chapter_5/valid/extra_credit/compound_divide.c": {"return_code": 2}, "chapter_5/valid/extra_credit/compound_bitwise_shiftr.c": {"return_code": 102}, "chapter_5/valid/extra_credit/compound_assignment_use_result.c": {"return_code": 8}, "chapter_5/valid/extra_credit/compound_bitwise_shiftl.c": {"return_code": 48}, "chapter_5/valid/extra_credit/compound_plus.c": {"return_code": 4}, "chapter_5/valid/extra_credit/compound_mod.c": {"return_code": 2}, "chapter_5/valid/extra_credit/bitwise_and_vars.c": {"return_code": 1}, "chapter_7/valid/declaration_only.c": {"return_code": 1}, "chapter_7/valid/assign_to_self_2.c": {"return_code": 3}, "chapter_7/valid/hidden_then_visible.c": {"return_code": 1}, "chapter_7/valid/hidden_variable.c": {"return_code": 1}, "chapter_7/valid/assign_to_self.c": {"return_code": 4}, "chapter_7/valid/inner_uninitialized.c": {"return_code": 4}, "chapter_7/valid/multiple_vars_same_name.c": {"return_code": 2}, "chapter_7/valid/use_in_inner_scope.c": {"return_code": 3}, "chapter_7/valid/empty_blocks.c": {"return_code": 30}, "chapter_7/valid/nested_if.c": {"return_code": 1}, "chapter_7/valid/similar_var_names.c": {"return_code": 28}, "chapter_7/valid/extra_credit/goto_before_declaration.c": {"return_code": 0}, "chapter_7/valid/extra_credit/compound_subtract_in_block.c": {"return_code": 1}, "chapter_7/valid/extra_credit/goto_inner_scope.c": {"return_code": 1}, "chapter_4/valid/le_true.c": {"return_code": 2}, "chapter_4/valid/ne_true.c": {"return_code": 1}, "chapter_4/valid/ge_false.c": {"return_code": 0}, "chapter_4/valid/not_zero.c": {"return_code": 1}, "chapter_4/valid/precedence_2.c": {"return_code": 0}, "chapter_4/valid/ge_true.c": {"return_code": 2}, "chapter_4/valid/eq_precedence.c": {"return_code": 1}, "chapter_4/valid/eq_false.c": {"return_code": 0}, "chapter_4/valid/or_short_circuit.c": {"return_code": 1}, "chapter_4/valid/not_sum.c": {"return_code": 1}, "chapter_4/valid/precedence_4.c": {"return_code": 1}, "chapter_4/valid/and_short_circuit.c": {"return_code": 0}, "chapter_4/valid/precedence_3.c": {"return_code": 0}, "chapter_4/valid/compare_arithmetic_results.c": {"return_code": 1}, "chapter_4/valid/and_false.c": {"return_code": 0}, "chapter_4/valid/precedence_5.c": {"return_code": 1}, "chapter_4/valid/associativity.c": {"return_code": 1}, "chapter_4/valid/gt_true.c": {"return_code": 1}, "chapter_4/valid/lt_false.c": {"return_code": 0}, "chapter_4/valid/or_true.c": {"return_code": 3}, "chapter_4/valid/or_false.c": {"return_code": 0}, "chapter_4/valid/eq_true.c": {"return_code": 1}, "chapter_4/valid/ne_false.c": {"return_code": 0}, "chapter_4/valid/multi_short_circuit.c": {"return_code": 0}, "chapter_4/valid/gt_false.c": {"return_code": 0}, "chapter_4/valid/operate_on_booleans.c": {"return_code": 0}, "chapter_4/valid/not.c": {"return_code": 0}, "chapter_4/valid/le_false.c": {"return_code": 0}, "chapter_4/valid/nested_ops.c": {"return_code": 0}, "chapter_4/valid/precedence.c": {"return_code": 1}, "chapter_4/valid/not_sum_2.c": {"return_code": 0}, "chapter_4/valid/and_true.c": {"return_code": 1}, "chapter_4/valid/lt_true.c": {"return_code": 1}, "chapter_4/valid/extra_credit/bitwise_precedence.c": {"return_code": 1}, "chapter_3/valid/mod.c": {"return_code": 0}, "chapter_3/valid/unop_add.c": {"return_code": 0}, "chapter_3/valid/associativity_3.c": {"return_code": 8}, "chapter_3/valid/mult.c": {"return_code": 6}, "chapter_3/valid/sub.c": {"return_code": 255}, "chapter_3/valid/div_neg.c": {"return_code": 254}, "chapter_3/valid/unop_parens.c": {"return_code": 253}, "chapter_3/valid/add.c": {"return_code": 3}, "chapter_3/valid/associativity.c": {"return_code": 252}, "chapter_3/valid/associativity_2.c": {"return_code": 1}, "chapter_3/valid/div.c": {"return_code": 2}, "chapter_3/valid/sub_neg.c": {"return_code": 3}, "chapter_3/valid/associativity_and_precedence.c": {"return_code": 10}, "chapter_3/valid/parens.c": {"return_code": 14}, "chapter_3/valid/precedence.c": {"return_code": 14}, "chapter_3/valid/extra_credit/bitwise_shiftr.c": {"return_code": 62}, "chapter_3/valid/extra_credit/bitwise_and.c": {"return_code": 1}, "chapter_3/valid/extra_credit/bitwise_shiftl.c": {"return_code": 140}, "chapter_3/valid/extra_credit/bitwise_or.c": {"return_code": 3}, "chapter_3/valid/extra_credit/bitwise_shift_precedence.c": {"return_code": 0}, "chapter_3/valid/extra_credit/bitwise_xor.c": {"return_code": 6}, "chapter_3/valid/extra_credit/bitwise_shift_associativity_2.c": {"return_code": 16}, "chapter_3/valid/extra_credit/bitwise_shift_associativity.c": {"return_code": 66}, "chapter_3/valid/extra_credit/bitwise_precedence.c": {"return_code": 21}, "chapter_11/valid/long_expressions/long_args.c": {"return_code": 0}, "chapter_11/valid/long_expressions/logical.c": {"return_code": 0}, "chapter_11/valid/long_expressions/type_specifiers.c": {"return_code": 0}, "chapter_11/valid/long_expressions/multi_op.c": {"return_code": 1}, "chapter_11/valid/long_expressions/large_constants.c": {"return_code": 0}, "chapter_11/valid/long_expressions/arithmetic_ops.c": {"return_code": 0}, "chapter_11/valid/long_expressions/return_long.c": {"return_code": 1}, "chapter_11/valid/long_expressions/comparisons.c": {"return_code": 0}, "chapter_11/valid/long_expressions/simple.c": {"return_code": 1}, "chapter_11/valid/long_expressions/static_long.c": {"return_code": 1}, "chapter_11/valid/long_expressions/long_and_int_locals.c": {"return_code": 0}, "chapter_11/valid/long_expressions/assign.c": {"return_code": 1}, "chapter_11/valid/libraries/long_args.c": {"return_code": 0}, "chapter_11/valid/libraries/maintain_stack_alignment.c": {"return_code": 12}, "chapter_11/valid/libraries/return_long.c": {"return_code": 1}, "chapter_11/valid/libraries/long_global_var.c": {"return_code": 0}, "chapter_11/valid/explicit_casts/truncate.c": {"return_code": 0}, "chapter_11/valid/explicit_casts/sign_extend.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/convert_by_assignment.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/common_type.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/long_constants.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/convert_function_arguments.c": {"return_code": 0}, "chapter_11/valid/implicit_casts/convert_static_initializer.c": {"return_code": 0}, "chapter_11/valid/extra_credit/bitwise_long_op.c": {"return_code": 1}, "chapter_11/valid/extra_credit/compound_assign_to_int.c": {"return_code": 1}, "chapter_11/valid/extra_credit/compound_assign_to_long.c": {"return_code": 1}, "chapter_11/valid/extra_credit/switch_int.c": {"return_code": 1}, "chapter_11/valid/extra_credit/switch_long.c": {"return_code": 1}, "chapter_19/constant_folding/all_types/fold_truncate.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_cast_to_double.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_ulong.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_double.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_extensions_and_copies.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_long.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_uint.c": {"return_code": 0}, "chapter_19/constant_folding/all_types/fold_cast_from_double.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_unary.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_conditional_jump.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_binary.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_control_flow.c": {"return_code": 0}, "chapter_19/constant_folding/int_only/fold_exception.c": {"return_code": 0}, "chapter_19/unreachable_code_elimination/remove_useless_starting_label.c": {"return_code": 99}, "chapter_19/unreachable_code_elimination/dead_for_loop.c": {"return_code": 10}, "chapter_19/unreachable_code_elimination/keep_final_jump.c": {"return_code": 17}, "chapter_19/unreachable_code_elimination/remove_jump_keep_label.c": {"return_code": 10}, "chapter_19/unreachable_code_elimination/dead_branch_inside_loop.c": {"return_code": 19}, "chapter_19/unreachable_code_elimination/empty.c": {"return_code": 0}, "chapter_19/unreachable_code_elimination/infinite_loop.c": {"return_code": 11}, "chapter_19/unreachable_code_elimination/constant_if_else.c": {"return_code": 45}, "chapter_19/unreachable_code_elimination/dead_blocks_with_predecessors.c": {"return_code": 5}, "chapter_19/unreachable_code_elimination/remove_conditional_jumps.c": {"return_code": 1}, "chapter_19/unreachable_code_elimination/dead_after_return.c": {"return_code": 2}, "chapter_19/unreachable_code_elimination/empty_block.c": {"return_code": 1}, "chapter_19/unreachable_code_elimination/dead_after_if_else.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/pointer_arithmetic.c": {"return_code": 2}, "chapter_19/copy_propagation/all_types/store_doesnt_kill.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/propagate_into_type_conversions.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/redundant_double_copies.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/char_type_conversion.c": {"return_code": 1, "stdout": "CBA@"}, "chapter_19/copy_propagation/all_types/alias_analysis.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/copy_struct.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/redundant_struct_copies.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/propagate_null_pointer.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/propagate_all_types.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/funcall_kills_aliased.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/dont_propagate/static_are_aliased.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/dont_propagate/store_kills_aliased.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/dont_propagate/copy_to_offset.c": {"return_code": 3}, "chapter_19/copy_propagation/all_types/dont_propagate/dont_propagate_addr_of.c": {"return_code": 0}, "chapter_19/copy_propagation/all_types/dont_propagate/type_conversion.c": {"return_code": 1}, "chapter_19/copy_propagation/all_types/dont_propagate/zero_neg_zero_different.c": {"return_code": 1}, "chapter_19/copy_propagation/int_only/killed_then_redefined.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/different_paths_same_copy.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/multi_path_no_kill.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/redundant_copies.c": {"return_code": 20}, "chapter_19/copy_propagation/int_only/fig_19_8.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/propagate_into_complex_expressions.c": {"return_code": 1}, "chapter_19/copy_propagation/int_only/propagate_static.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/propagate_static_var.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/kill_and_add_copies.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/init_all_copies.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/propagate_params.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/nested_loops.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/constant_propagation.c": {"return_code": 6}, "chapter_19/copy_propagation/int_only/propagate_var.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/different_source_values_same_copy.c": {"return_code": 1}, "chapter_19/copy_propagation/int_only/dont_propagate/source_killed_on_one_path.c": {"return_code": 0, "stdout": "DA"}, "chapter_19/copy_propagation/int_only/dont_propagate/one_reaching_copy.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/dont_propagate/dest_killed.c": {"return_code": 4}, "chapter_19/copy_propagation/int_only/dont_propagate/no_copies_reach_entry.c": {"return_code": 4}, "chapter_19/copy_propagation/int_only/dont_propagate/listing_19_14.c": {"return_code": 101}, "chapter_19/copy_propagation/int_only/dont_propagate/add_all_blocks_to_worklist.c": {"return_code": 100}, "chapter_19/copy_propagation/int_only/dont_propagate/multi_values.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/dont_propagate/static_dst_killed.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/dont_propagate/static_src_killed.c": {"return_code": 0}, "chapter_19/copy_propagation/int_only/dont_propagate/source_killed.c": {"return_code": 0}, "chapter_19/dead_store_elimination/all_types/aliased_dead_at_exit.c": {"return_code": 1}, "chapter_19/dead_store_elimination/all_types/getaddr_doesnt_gen.c": {"return_code": 0}, "chapter_19/dead_store_elimination/all_types/copy_to_dead_struct.c": {"return_code": 4}, "chapter_19/dead_store_elimination/all_types/dont_elim/copytooffset_doesnt_kill.c": {"return_code": 101}, "chapter_19/dead_store_elimination/all_types/dont_elim/store_generates_dst.c": {"return_code": 4}, "chapter_19/dead_store_elimination/all_types/dont_elim/load_generates_pointer.c": {"return_code": 10}, "chapter_19/dead_store_elimination/all_types/dont_elim/load_through_pointer.c": {"return_code": 10}, "chapter_19/dead_store_elimination/all_types/dont_elim/pass_pointer_to_fun.c": {"return_code": 5}, "chapter_19/dead_store_elimination/all_types/dont_elim/never_kill_store.c": {"return_code": 4}, "chapter_19/dead_store_elimination/all_types/dont_elim/copyfromoffset_gen.c": {"return_code": 3}, "chapter_19/dead_store_elimination/int_only/dead_store_static_var.c": {"return_code": 0}, "chapter_19/dead_store_elimination/int_only/loop_dead_store.c": {"return_code": 0, "stdout": "CHNTZ"}, "chapter_19/dead_store_elimination/int_only/simple.c": {"return_code": 3}, "chapter_19/dead_store_elimination/int_only/elim_second_copy.c": {"return_code": 0}, "chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_at_exit.c": {"return_code": 0}, "chapter_19/dead_store_elimination/int_only/dont_elim/used_one_path.c": {"return_code": 0}, "chapter_19/dead_store_elimination/int_only/dont_elim/dont_remove_funcall.c": {"return_code": 0, "stdout": "C"}, "chapter_19/dead_store_elimination/int_only/dont_elim/add_all_to_worklist.c": {"return_code": 0, "stdout": "ML"}, "chapter_19/dead_store_elimination/int_only/dont_elim/loop.c": {"return_code": 1}, "chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_fun.c": {"return_code": 5}, "chapter_19/whole_pipeline/all_types/unsigned_wraparound.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/unsigned_compare.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/signed_unsigned_conversion.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/alias_analysis_change.c": {"return_code": 0}, "chapter_19/whole_pipeline/all_types/not_char.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/const_fold_sign_extend.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/char_round_trip.c": {"return_code": 1}, "chapter_19/whole_pipeline/all_types/const_fold_sign_extend_2.c": {"return_code": 1}, "chapter_19/whole_pipeline/int_only/dead_condition.c": {"return_code": 10}, "chapter_19/whole_pipeline/int_only/elim_and_copy_prop.c": {"return_code": 10}, "chapter_19/whole_pipeline/int_only/remainder_test.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/mixed_ints.c": {"return_code": 9}, "chapter_20/all_types/no_coalescing/dbl_trivially_colorable.c": {"return_code": 3}, "chapter_20/all_types/no_coalescing/spill_movz_dst.c": {"return_code": 29}, "chapter_20/all_types/no_coalescing/push_xmm.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/dbl_fun_call.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/stack_alignment.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/track_dbl_arg_registers.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/fourteen_pseudos_interfere.c": {"return_code": 0}, "chapter_20/all_types/no_coalescing/div_interference.c": {"return_code": 1}, "chapter_20/all_types/no_coalescing/test_spilling_dbls.c": {"return_code": 3}, "chapter_20/all_types/no_coalescing/store_pointer_in_register.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/same_instr_interference.c": {"return_code": 6}, "chapter_20/int_only/no_coalescing/spills_rewrites_compare.c": {"return_code": 3}, "chapter_20/int_only/no_coalescing/copy_and_separate_interference.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/spills_and_rewrites.c": {"return_code": 23}, "chapter_20/int_only/no_coalescing/cmp_liveness.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/rewrite_large_multiply.c": {"return_code": 58}, "chapter_20/int_only/no_coalescing/spill_callee_saved.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/test_spill_metric.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/unary_interference.c": {"return_code": 10}, "chapter_20/int_only/no_coalescing/optimistic_coloring.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/track_arg_registers.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/many_pseudos_fewer_conflicts.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/same_instr_no_interference.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/copy_no_interference.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/force_spill.c": {"return_code": 9}, "chapter_20/int_only/no_coalescing/callee_saved_stack_alignment.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/idiv_interference.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/preserve_across_fun_call.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/use_all_hardregs.c": {"return_code": 0}, "chapter_20/int_only/no_coalescing/test_spill_metric_2.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/loop.c": {"return_code": 6}, "chapter_20/int_only/no_coalescing/trivially_colorable.c": {"return_code": 1}, "chapter_20/int_only/no_coalescing/cdq_interference.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/cdq_generates_ax.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/callee_saved_live_at_exit.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/coalesce_prevents_spill.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/george_coalesce.c": {"return_code": 1}, "chapter_20/int_only/with_coalescing/unary_generates_dst.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/briggs_coalesce.c": {"return_code": 2}, "chapter_20/int_only/with_coalescing/bin_generates_dst.c": {"return_code": 187}, "chapter_20/int_only/with_coalescing/briggs_coalesce_tmps.c": {"return_code": 1}, "chapter_20/int_only/with_coalescing/cmp_generates_operands.c": {"return_code": 1}, "chapter_20/int_only/with_coalescing/funcall_generates_args.c": {"return_code": 0}, "chapter_20/int_only/with_coalescing/eax_live_at_exit.c": {"return_code": 1}, "chapter_19/dead_store_elimination/int_only/static_not_always_live.c": {"return_code": 23}, "chapter_19/dead_store_elimination/int_only/fig_19_11.c": {"return_code": 0}, "chapter_19/dead_store_elimination/int_only/delete_arithmetic_ops.c": {"return_code": 5}, "chapter_19/dead_store_elimination/int_only/initialize_blocks_with_empty_set.c": {"return_code": 1}, "chapter_19/dead_store_elimination/int_only/dont_elim/self_copy.c": {"return_code": 0}, "chapter_19/dead_store_elimination/int_only/dont_elim/recognize_all_uses.c": {"return_code": 0}, "chapter_19/dead_store_elimination/int_only/dont_elim/nested_loops.c": {"return_code": 0, "stdout": "DKHEB"}} \ No newline at end of file diff --git a/generate_expected_results.py b/generate_expected_results.py index 7e76182c..f764cf3a 100755 --- a/generate_expected_results.py +++ b/generate_expected_results.py @@ -20,7 +20,7 @@ def lookup_regalloc_libs(prog: Path) -> List[Path]: """Look up extra library we need to link against for regalloc tests""" - # TODO fix copypasta b/t here and test_programs.py (ditto for lookup_assembly libs) + # TODO fix copypasta b/t here and test_programs.py test_info = regalloc.REGALLOC_TESTS.get(prog.name) if test_info is None: return [] @@ -35,16 +35,17 @@ def lookup_regalloc_libs(prog: Path) -> List[Path]: ] -def lookup_assembly_libs(prog: Path) -> List[Path]: - """Look up extra assembly library we need to link against""" - k = basic.get_props_key(prog) - if k in basic.ASSEMBLY_DEPENDENCIES: - platfrm = basic.get_platform() - dep = basic.ASSEMBLY_DEPENDENCIES[k][platfrm] +def cleanup_keys() -> None: + """Remove entries from expected_results.json where the corresponding file doesn't exist.""" - return [prog.with_name(dep)] - - return [] + # Note: need to construct a list of keys and iterate over that, + # rather than iterating over dict directly, b/c dict size can't change during iteration + all_keys = list(results.keys()) + for k in all_keys: + full_path = TEST_DIR / k + if not full_path.exists(): + del results[k] + return def main() -> None: @@ -111,7 +112,7 @@ def main() -> None: or str(rel_path).replace(".c", "_client.c") in changed_files or str(rel_path).replace("_client.c", ".c") in changed_files or any(lib in changed_files for lib in lookup_regalloc_libs(p)) - or any(lib in changed_files for lib in lookup_assembly_libs(p)) + or any(lib in changed_files for lib in basic.get_libs(p)) or any( h for h in changed_files @@ -120,7 +121,7 @@ def main() -> None: ): progs.append(p) - # load the json file from that commit ot use as baseline + # load the json file from that commit to use as baseline subprocess.run( f"git show {baseline}:expected_results.json > expected_results_orig.json", shell=True, @@ -130,6 +131,7 @@ def main() -> None: with open("expected_results_orig.json", "r", encoding="utf-8") as f: results.update(json.load(f)) Path("expected_results_orig.json").unlink() + cleanup_keys() # iterate over all valid programs for prog in progs: @@ -145,17 +147,8 @@ def main() -> None: client = prog.parent.joinpath(prog.name.replace(".c", "_client.c")) source_files.append(client) - if basic.get_props_key(prog) in basic.ASSEMBLY_DEPENDENCIES: - asm_lib = basic.ASSEMBLY_DEPENDENCIES[basic.get_props_key(prog)][ - basic.get_platform() - ] - asm_path = prog.with_name(asm_lib) - source_files.append(asm_path) - - if basic.get_props_key(prog) in basic.DEPENDENCIES: - lib = basic.DEPENDENCIES[basic.get_props_key(prog)] - lib_path = basic.TEST_DIR / lib - source_files.append(lib_path) + # prog may have some extra dependencies + source_files.extend(basic.get_libs(prog)) if "chapter_20" in prog.parts: # we may need to include wrapper script and other library files diff --git a/test_framework/basic.py b/test_framework/basic.py index 858224fe..29c245a7 100644 --- a/test_framework/basic.py +++ b/test_framework/basic.py @@ -49,7 +49,11 @@ def get_platform() -> str: def get_props_key(source_file: Path) -> str: - """key to use in EXPECTED_RESULTS, REQUIRES_MATHLIB, EXTRA_CREDIT_PROGRAMS""" + """key to use in EXPECTED_RESULTS, REQUIRES_MATHLIB, EXTRA_CREDIT_PROGRAMS + If this ends with _client.c, use corresponding lib as props key + """ + if source_file.stem.endswith("_client"): + source_file = replace_stem(source_file, source_file.stem[: -len("_client")]) return str(source_file.relative_to(TEST_DIR)) @@ -58,6 +62,25 @@ def needs_mathlib(prog: Path) -> bool: return key in REQUIRES_MATHLIB and not IS_OSX +def get_libs(prog: Path) -> List[Path]: + """Get extra libraries this test program depends on (aside from lib/client pairs)""" + props_key = get_props_key(prog) + libs = [] + if props_key in ASSEMBLY_DEPENDENCIES: + platfrm: str + platfrm = get_platform() + asm_filename = ASSEMBLY_DEPENDENCIES[props_key][platfrm] + asm_path = prog.with_name( + asm_filename + ) # assembly file is in the same directory as program under test + libs.append(asm_path) + if props_key in DEPENDENCIES: + lib_filename = DEPENDENCIES[props_key] + lib_path = TEST_DIR / lib_filename + libs.append(lib_path) + return libs + + def print_stderr(proc: subprocess.CompletedProcess[str]) -> None: """Print out stderr of CompletedProcess if it's not empty. Intended to print assembler/linker warnings""" if proc.stderr: @@ -279,6 +302,12 @@ def compile_success(self, source_file: Path) -> None: def compile_and_run(self, source_file: Path) -> None: """Compile a valid test program, run it, and validate the results""" + # if this depends on extra libraries, call library_test_helper instead + extra_libs = get_libs(source_file) + if extra_libs: + self.library_test_helper(source_file, extra_libs) + return + # include -lm for standard library test on linux if needs_mathlib(source_file): cc_opt = "-lm" @@ -305,19 +334,17 @@ def compile_and_run(self, source_file: Path) -> None: self.validate_runs(source_file, result) def library_test_helper( - self, file_under_test: Path, other_file: Path, results_key: Path + self, file_under_test: Path, other_files: List[Path] ) -> None: """Compile one file in a multi-file program and validate the results. - Compile file_under_test with compiler under test and other_file with 'gcc' command. + Compile file_under_test with compiler under test and other_files with 'gcc' command. Link 'em together, run the resulting executable, make validate the results. Args: file_under_test: Absolute path of one file in a multi-file program (the one we want to compile with self.cc) - other_file: Absolute path to the other file in the multi-file program - results_key: key to use in EXPECTED_RESULTS; will be either file_under_test - or other_file, whichever one is the library file + other_files: Absolute paths to other files in the multi-file program """ # compile file_under_test and make sure it succeeds @@ -334,44 +361,28 @@ def library_test_helper( # compile other file, link with object file produced by compiler under test, # and run resulting executable - source_files = [file_under_test.with_suffix(".o"), other_file] + source_files = [file_under_test.with_suffix(".o")] + other_files options = [] - if needs_mathlib(file_under_test) or needs_mathlib(other_file): + if needs_mathlib(file_under_test) or any(needs_mathlib(f) for f in other_files): options.append("-lm") result = gcc_compile_and_run(source_files, options) # validate results - self.validate_runs(results_key, result) + self.validate_runs(file_under_test, result) def compile_client_and_run(self, client_path: Path) -> None: """Multi-file program test where our compiler compiles the client""" # _client.c should have corresponding library .c in the same directory lib_path = replace_stem(client_path, client_path.stem[: -len("_client")]) - self.library_test_helper(client_path, lib_path, lib_path) - - def compile_with_helper_lib_and_run(self, path: Path) -> None: - key = get_props_key(path) - lib_filename = DEPENDENCIES[key] - lib_path = TEST_DIR / lib_filename - self.library_test_helper(path, lib_path, path) - - def compile_with_asm_lib_and_run(self, path: Path) -> None: - key = get_props_key(path) - platfrm: str - platfrm = get_platform() - asm_filename = ASSEMBLY_DEPENDENCIES[key][platfrm] - asm_path = path.with_name( - asm_filename - ) # assembly file is in the same directory as program under test - self.library_test_helper(path, asm_path, path) + self.library_test_helper(client_path, [lib_path]) def compile_lib_and_run(self, lib_path: Path) -> None: """Multi-file program test where our compiler compiles the library""" # program path .c should have corresponding _client.c in same directory client_path = replace_stem(lib_path, lib_path.stem + "_client") - self.library_test_helper(lib_path, client_path, lib_path) + self.library_test_helper(lib_path, [client_path]) # Automatically generating test classes + methods @@ -503,22 +514,12 @@ def test_valid(self: TestChapter) -> None: def make_test_run(program: Path) -> Callable[[TestChapter], None]: - """Generate one test method to compile and run a valid single-file program""" - - if get_props_key(program) in ASSEMBLY_DEPENDENCIES: - - def test_run(self: TestChapter) -> None: - self.compile_with_asm_lib_and_run(program) - - elif get_props_key(program) in DEPENDENCIES: - - def test_run(self: TestChapter) -> None: - self.compile_with_helper_lib_and_run(program) - - else: + """Generate one test method to compile and run a valid single-file program + (the program may depend on additional source or assembly files that are not under test) + """ - def test_run(self: TestChapter) -> None: - self.compile_and_run(program) + def test_run(self: TestChapter) -> None: + self.compile_and_run(program) return test_run diff --git a/test_framework/tacky/common.py b/test_framework/tacky/common.py index 5a3d4271..9d6e3303 100644 --- a/test_framework/tacky/common.py +++ b/test_framework/tacky/common.py @@ -54,9 +54,9 @@ def run_and_parse_all(self, source_file: Path) -> dict[str, asm.AssemblyFunction compile_result ) # print compiler warnings even if it succeeded asm_file = source_file.with_suffix(".s") - + libs = basic.get_libs(source_file) # assemble/link asm_file, run it, and make sure it gives expected result - actual_result = basic.gcc_compile_and_run([asm_file], []) + actual_result = basic.gcc_compile_and_run([asm_file] + libs, []) self.validate_runs(source_file, actual_result) # now parse the assembly file and extract the function named "target" diff --git a/test_framework/tacky/dead_store_elim.py b/test_framework/tacky/dead_store_elim.py index eb6e682f..cf1e6c24 100644 --- a/test_framework/tacky/dead_store_elim.py +++ b/test_framework/tacky/dead_store_elim.py @@ -29,10 +29,11 @@ class TestDeadStoreElimination(common.TackyOptimizationTest): STORE_ELIMINATED = { # int-only "dead_store_static_var.c": 5, - "elim_second_copy.c": 10, - "fig_19_12.c": 10, + "elim_second_copy.c": 100, + "fig_19_11.c": 10, "loop_dead_store.c": 5, - "simple.c": 10, + "static_not_always_live.c": 30, + "initialize_blocks_with_empty_set.c": 10, # other types "aliased_dead_at_exit.c": 50, "copy_to_dead_struct.c": 10, @@ -41,7 +42,9 @@ class TestDeadStoreElimination(common.TackyOptimizationTest): # programs to validate with return_const_test, with expected return value RETURN_CONST = { - "use_and_kill.c": 5, + "self_copy.c": 5, + "delete_arithmetic_ops.c": 5, + "simple.c": 3, } diff --git a/test_properties.json b/test_properties.json index e3270f59..8585cd7e 100644 --- a/test_properties.json +++ b/test_properties.json @@ -106,7 +106,7 @@ ], "chapter_6/invalid_semantics/extra_credit/duplicate_labels.c": [ "goto" - ], + ], "chapter_6/valid/extra_credit/bitwise_ternary.c": [ "bitwise" ], @@ -139,7 +139,7 @@ ], "chapter_7/invalid_semantics/extra_credit/duplicate_labels_different_scopes.c": [ "goto" - ], + ], "chapter_7/valid/extra_credit/compound_subtract_in_block.c": [ "compound" ], @@ -377,7 +377,8 @@ "chapter_13/valid/libraries/double_params_and_result.c" ], "libs": { - "chapter_19/unreachable_code_elimination/infinite_loop.c": "chapter_19/helper_libs/exit.c" + "chapter_19/unreachable_code_elimination/infinite_loop.c": "chapter_19/helper_libs/exit.c", + "chapter_19/dead_store_elimination/int_only/static_not_always_live.c": "chapter_19/helper_libs/exit.c" }, "assembly_libs": { "chapter_10/valid/push_arg_on_page_boundary.c": { diff --git a/tests/chapter_19/dead_store_elimination/README.md b/tests/chapter_19/dead_store_elimination/README.md new file mode 100644 index 00000000..088bf362 --- /dev/null +++ b/tests/chapter_19/dead_store_elimination/README.md @@ -0,0 +1,3 @@ +To validate that dead stores were eliminated, the test script inspects the assembly for the `target` function. + +In most programs, dead store elimination should remove a `Copy` of the form `var = const`, so the test script just validates that that constant doesn't appear in the program. In a couple of cases (`simple.c`, `delete_arithmetic_ops.c` and `self`), dead store elimination combined with other optimizations should eliminate the whole function body except the `Return` instruction; these are validated the same way as the constant-folding tests. The test cases in the `dont_elim` directories cover cases where stores _shouldn't_ be eliminated. The test script doesn't inspect the assembly for these; it just validates that they behave correctly. \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dead_store_static_var.c b/tests/chapter_19/dead_store_elimination/int_only/dead_store_static_var.c index a9be05c9..17c937b0 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/dead_store_static_var.c +++ b/tests/chapter_19/dead_store_elimination/int_only/dead_store_static_var.c @@ -1,14 +1,27 @@ +/* Test that we eliminate dead stores to static and global variables */ + +int i = 0; + int target(int arg) { - static int i; - if (arg < 0) - return i; - i = 5; // this is dead - i = arg; - return i; + i = 5; // dead store + i = arg; + return i + 1; } int main(void) { - int result1 = target(2); - int result2 = target(-1); - return result1 == 2 && result2 == 2; + int result1 = target(2); + if (i != 2) { + return 1; // fail + } + if (result1 != 3) { + return 2; // fail + } + int result2 = target(-1); + if (i != -1) { + return 3; // fail + } + if (result2 != 0) { + return 4; // fail + } + return 0; // success } \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/delete_arithmetic_ops.c b/tests/chapter_19/dead_store_elimination/int_only/delete_arithmetic_ops.c new file mode 100644 index 00000000..61b4b890 --- /dev/null +++ b/tests/chapter_19/dead_store_elimination/int_only/delete_arithmetic_ops.c @@ -0,0 +1,17 @@ +/* In most of our test cases, the dead store we remove is a Copy. + * This test case validates that we can remove dead + * Binary and Unary instructions too. + * */ + +int a = 1; +int b = 2; + +int target(void) { + // everything except the Return instruction should be optimized away. + int unused = a * -b; + return 5; +} + +int main(void) { + return target(); +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/add_all_to_worklist.c b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/add_all_to_worklist.c index 66800bda..1b9bb0cd 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/add_all_to_worklist.c +++ b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/add_all_to_worklist.c @@ -1,18 +1,25 @@ +/* Make sure we add every basic block to the worklist + * at the start of the iterative algorithm + */ int putchar(int c); -int f(int arg) -{ +int f(int arg) { int x = 76; - // no live variables going into this basic block, + if (arg < 10) { + // give x multiple values on different paths + // so we can't propagate it + x = 77; + } + // no live variables flow into this basic block from its successor, // bu we still need to process it to learn that x is live if (arg) putchar(x); return 0; } -int main(void) -{ +int main(void) { f(0); f(1); + f(11); return 0; } \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/dont_remove_funcall.c b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/dont_remove_funcall.c index 7afa1e5a..62dc7c6c 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/dont_remove_funcall.c +++ b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/dont_remove_funcall.c @@ -1,14 +1,17 @@ +/* Test that we never optimize away function calls, + * even if they're dead stores (i.e. update dead variables) + * because they can have side effects */ #if defined SUPPRESS_WARNINGS #pragma GCC diagnostic ignored "-Wunused-variable" #endif - int putchar(int c); -int main(void) -{ - // this is a dead store but we still shouldn't optimize away the function call! - // remove store to x is safe but our implementation won't remove it +int main(void) { + // Make sure we don't optimize away this function call. + // It would be safe to keep the function call, but optimize out + // the store to x (i.e. get rid of movl %eax, %x), but our implementation + // doesn't. int x = putchar(67); return 0; } \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/loop.c b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/loop.c index cf479367..67ab7e96 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/loop.c +++ b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/loop.c @@ -1,16 +1,22 @@ -int f(int a, int b) -{ - return a + b; +/* Test case where a block is its own predecessor + * */ + +int putchar(int c); + +int fib(int count) { + int n0 = 0; + int n1 = 1; + int i = 0; + do { + int n2 = n0 + n1; + n0 = n1; // not a dead store b/c n0 is used again in the next loop + // iteration, in n2 = n0 + n1 + n1 = n2; + i = i + 1; + } while (i < count); + return n1; } -int main(void) -{ - int x = 3; - int y = 2; - while (y < 50) - { - y = f(x, y); - x = y + 2; // not dead b/c x is used in next loop iteration - } - return y; +int main(void) { + return (fib(20) == 10946); } \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/nested_loops.c b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/nested_loops.c new file mode 100644 index 00000000..7221cd46 --- /dev/null +++ b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/nested_loops.c @@ -0,0 +1,31 @@ +/* Test that the algorithm runs until it converges; + * some blocks need to be visited three times before the algorithm converges + * */ + +int putchar(int c); + +int target(int a, int b, int c, int d) { + while (a > 0) { + while (c > 0) { + putchar(c + d); + c = c - 1; + if (d % 2) { + c = c - 2; + } + } + + while (b > 0) { + c = 10; // this is not dead, b/c it's used in previous while + // loop, but it takes multiple passes for that + // information to propagate to this point + b = b - 1; + } + + a = a - 1; + } + return 0; +} + +int main(void) { + return target(5, 4, 3, 65); +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/recognize_all_uses.c b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/recognize_all_uses.c new file mode 100644 index 00000000..8313dfea --- /dev/null +++ b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/recognize_all_uses.c @@ -0,0 +1,88 @@ +/* Make sure we recognize all the different ways a variable + * can be used/generated (in Unary, Binary, JumpIfZero, etc.) */ + +int test_jz(int flag, int arg) { + if (flag) { + arg = 0; // this store is not dead b/c arg is used later; + // put it in an if statement so we don't propagate 0 into + // return statement + } + return arg ? 1 : 2; +} + +int test_jnz(int flag, int arg) { + if (flag) { + arg = 0; + } + return arg || 0; +} + +int test_binary(int flag, int arg1, int arg2) { + if (flag == 0) { + arg1 = 4; // this store is not dead b/c arg is used later; + // put it in an if statement so we don't propagate 4 into + // return statement + } else if (flag == 1) { + arg2 = 3; // also not a dead store + } + return arg1 * arg2; // generates arg1 and arg2 +} + +int test_unary(int flag, int arg) { + if (flag) { + arg = 5; // this store is not dead b/c arg is used later; + // put it in an if statement so we don't propagate 5 into + // return statement + } + return -arg; // generates arg +} + +int f(int arg) { + return arg + 1; +} + +int test_funcall(int flag, int arg) { + if (flag) { + arg = 7; // this store is not dead b/c arg is used later; + // put it in an if statement so we don't propagate 7 into + // return statement + } + return f(arg); +} + +int main(void) { + if (test_jz(1, 1) != 2) { // 0 ? 1 : 2 + return 1; // fail + } + if (test_jz(0, 1) != 1) { // 1 ? 1 : 2 + return 2; // fail + } + if (test_jnz(1, 1) != 0) { // 0 || 0 + return 3; // fail + } + if (test_jnz(0, 1) != 1) { // 1 || 1 + return 4; // fail + } + if (test_binary(0, 8, 9) != 36) { // 4 * 9 + return 5; // fail + } + if (test_binary(1, 8, 9) != 24) { // 8 * 3 + return 6; // fail + } + if (test_binary(2, 8, 9) != 72) { // 8 * 9 + return 7; // fail + } + if (test_unary(0, 8) != -8) { + return 8; // fail + } + if (test_unary(1, 8) != -5) { + return 9; // fail + } + if (test_funcall(1, 5) != 8) { // f(7) => 7 + 1 + return 10; // fail + } + if (test_funcall(0, 9) != 10) { // f(9) ==> 9 + 1 + return 11; // fail + } + return 0; +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/self_copy.c b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/self_copy.c new file mode 100644 index 00000000..7895b83b --- /dev/null +++ b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/self_copy.c @@ -0,0 +1,26 @@ +/* Test that updating and using a value in the same instruction generates it + * rather than killing it. */ + +int target(int flag) { + int i = 2; + // make sure value of i isn't known at compile time, + // so we can't propagate it + if (flag) { + i = 3; + } + i = i; // this is a no-op, but it doesn't kill i + // if we treat this as a kill instead of a gen, + // we'll incorrectly eliminate both earlier copies to i + // as dead stores + return i; +} + +int main(void) { + if (target(0) != 2) { + return 1; // fail + } + if (target(1) != 3) { + return 2; // fail + } + return 0; // success +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_at_exit.c b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_at_exit.c index 29f9350e..0bff8309 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_at_exit.c +++ b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_at_exit.c @@ -1,13 +1,19 @@ -int f(void) -{ +/* Make sure we reocgnize that static local variables may be live at exit */ +int f(void) { static int i = 10; if (i == 5) return 0; - i = 5; // not a dead store! i is live at exit + i = 5; // not a dead store! i is live at exit return 1; } -int main(void) -{ - return f() + f(); +int main(void) { + + if (f() != 1) { + return 1; // fail + } + if (f() != 0) { + return 2; // fail + } + return 0; } \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_fun.c b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_fun.c index 809ea972..83a32da6 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_fun.c +++ b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/static_vars_fun.c @@ -1,12 +1,13 @@ +/* Test that we recognize that function calls generate all static variables */ int x = 100; -int get_x(void) -{ +int get_x(void) { return x; } -int main(void) -{ - x = 5; // don't eliminate this! - return get_x(); +int main(void) { + x = 5; // don't eliminate this! + int result = get_x(); + x = 10; + return result; } \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/used_one_path.c b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/used_one_path.c index 6fbcfeec..c89f0f03 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/dont_elim/used_one_path.c +++ b/tests/chapter_19/dead_store_elimination/int_only/dont_elim/used_one_path.c @@ -1,9 +1,20 @@ -// cf figure 20-11 +/* A variable is live if it's used later on one path but not others. + * Loosely based on figure 19-10 + * */ + int f(int arg, int flag) { - int x = arg * 2; - if (flag) - return x; - return 0; + int x = arg * 2; // not dead, b/c x is live on one path + if (flag) + return x; + return 0; } -int main(void) { return f(20, 1) + f(3, 0); } \ No newline at end of file +int main(void) { + if (f(20, 1) != 40) { + return 1; // fail + } + if (f(3, 0) != 0) { + return 2; // fail + } + return 0; // success +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/elim_second_copy.c b/tests/chapter_19/dead_store_elimination/int_only/elim_second_copy.c index aea3a40d..9a6c6cf2 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/elim_second_copy.c +++ b/tests/chapter_19/dead_store_elimination/int_only/elim_second_copy.c @@ -1,10 +1,30 @@ -int callee(int arg) { return arg * 2; } +/* We can recognize that one store to a variable is a dead store, + * but another store to that variable at a different point in the program + * is not. + * */ +int callee(int arg) { + return arg * 2; +} -int target(int arg) { - int x = arg + 1; // not dead - int y = callee(x); - x = 10; // dead - return y; +int target(int arg, int flag) { + int x = arg + 1; // not a dead store + if (flag) { + // make sure x has more than one possible value, + // so copy prop doesn't just replace it with a temporary + // variable callee + x = arg - 1; + } + int y = callee(x); // this generates x + x = 100; // dead store + return y; } -int main(void) { return target(4); } \ No newline at end of file +int main(void) { + if (target(4, 0) != 10) { + return 1; // fail + } + if (target(3, 1) != 4) { + return 2; // fail + } + return 0; // success +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/fig_19_11.c b/tests/chapter_19/dead_store_elimination/int_only/fig_19_11.c new file mode 100644 index 00000000..7e623838 --- /dev/null +++ b/tests/chapter_19/dead_store_elimination/int_only/fig_19_11.c @@ -0,0 +1,34 @@ +/* We recognize an update to some variable as a dead store + * when there are multiple paths from the store to some use of that + * variable, and it's killed by different instructions + * on those different paths. + * This example is loosely based on Figure 19-11. + * */ +int callee(void) { + return 4; +} + +int callee2(void) { + return 5; +} + +int target(int flag) { + int x = 10; // this is a dead store; make sure its eliminated + if (flag) { + x = callee(); // this kills x; it's dead at earlier points + } else { + x = callee2(); // this kills x; it's dead at earlier points + } + return x; // this generates x; it's live at earlier points +} + +int main(void) { + if (target(1) != 4) { + return 1; // fail + } + if (target(0) != 5) { + return 2; // fail + } + + return 0; // success +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/fig_19_12.c b/tests/chapter_19/dead_store_elimination/int_only/fig_19_12.c deleted file mode 100644 index 17f8e1ff..00000000 --- a/tests/chapter_19/dead_store_elimination/int_only/fig_19_12.c +++ /dev/null @@ -1,15 +0,0 @@ -int callee(void) { return 4; } - -int callee2(void) { return 5; } - -int target(int flag) { - int x = 10; // eliminate this! - if (flag) { - x = callee(); - } else { - x = callee2(); - } - return x; -} - -int main(void) { return target(0) + target(1); } \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/initialize_blocks_with_empty_set.c b/tests/chapter_19/dead_store_elimination/int_only/initialize_blocks_with_empty_set.c new file mode 100644 index 00000000..d0ba7e59 --- /dev/null +++ b/tests/chapter_19/dead_store_elimination/int_only/initialize_blocks_with_empty_set.c @@ -0,0 +1,23 @@ +/* Test that we initialize each block in the CFG with an empty set of + * live variables. Specifically, this test will fail if each block is + * initialized with the set of all static variables. + */ + +int j = 3; +int target(void) { + static int i; + i = 10; // dead store, b/c i is killed on path to exit + // but if we initially think i is live at the start of the + // while loop, our analysis will never figure out that it's dead + // here + while (j > 0) { + j = j - 1; + } + i = 0; + return 0; +} + +int main(void) { + target(); + return (j == 0); // just make sure target() actually did something +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/loop_dead_store.c b/tests/chapter_19/dead_store_elimination/int_only/loop_dead_store.c index b99aa186..091246bc 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/loop_dead_store.c +++ b/tests/chapter_19/dead_store_elimination/int_only/loop_dead_store.c @@ -1,13 +1,27 @@ -int callee(int i) { return i + 1; } +/* Test that we can detect dead stores in a function with a loop */ +int putchar(int c); // from standard library int target(void) { - int x = 5; // dead - int y = 3; // not - do { - x = y * 2; - y = y + callee(x); - } while (y < 20); - return x + y; + int x = 5; // dead store + int y = 65; // not a dead store + do { + x = y + 2; // kill x, gen y + if (y > 70) { + // make sure we assign to x on multiple paths + // so copy prop doesn't replace it entirely + x = y + 3; + } + y = putchar(x) + 3; // gen x and y + } while (y < 90); + if (x != 90) { + return 1; // fail + } + if (y != 93) { + return 2; // fail + } + return 0; // success } -int main(void) { return target(); } \ No newline at end of file +int main(void) { + return target(); +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/simple.c b/tests/chapter_19/dead_store_elimination/int_only/simple.c index b3c6a91c..24ed3187 100644 --- a/tests/chapter_19/dead_store_elimination/int_only/simple.c +++ b/tests/chapter_19/dead_store_elimination/int_only/simple.c @@ -1,11 +1,14 @@ +/* A basic test case for eliminating a dead store */ + #if defined SUPPRESS_WARNINGS #pragma GCC diagnostic ignored "-Wunused-variable" #endif int target(void) { - // make sure we don't use constant 10 - int x = 10; - return 3; + int x = 10; // this is a dead store + return 3; } -int main(void) { return target(); } \ No newline at end of file +int main(void) { + return target(); +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/static_not_always_live.c b/tests/chapter_19/dead_store_elimination/int_only/static_not_always_live.c new file mode 100644 index 00000000..9229bd14 --- /dev/null +++ b/tests/chapter_19/dead_store_elimination/int_only/static_not_always_live.c @@ -0,0 +1,33 @@ +/* Make sure the meet operator doesn't always assume static variables are live; + * they're only generated by uses, function calls, and EXIT. + * Test this using a program that never reaches EXIT (but does terminate + * by caling the exit function indirectly) + * */ + +int exit_wrapper(int status); // defined in chapter_19/libraries/exit.c + +int i; + +int target(void) { + i = 30; // dead store! + // i isn't killed in this block but it's killed on all paths to function + // call + int counter = 0; + + do { + if (counter < 10) { + i = counter + 1; + } else { + i = counter + 2; + } + if (counter > 20) { + exit_wrapper(i); + } + counter = counter + 1; + } while (1); + return 0; +} + +int main(void) { + target(); +} \ No newline at end of file diff --git a/tests/chapter_19/dead_store_elimination/int_only/use_and_kill.c b/tests/chapter_19/dead_store_elimination/int_only/use_and_kill.c deleted file mode 100644 index f5ca2180..00000000 --- a/tests/chapter_19/dead_store_elimination/int_only/use_and_kill.c +++ /dev/null @@ -1,10 +0,0 @@ -int target(void) { - // we can eliminate both assignments to x - // (look for: no movl $10, no addition, no inc...no function body basically) - int x = 10; - x = x + 1; - return 5; // return 5, not 0, so it will be set with mov and not xor even if - // they're being clever -} - -int main(void) { return target(); } \ No newline at end of file