void test_branch_opcode_ends_basic_block(void) { struct basic_block *bb1, *bb2, *bb3; struct compilation_unit *cu; struct cafebabe_method_info method_info; struct vm_method method = { .code_attribute.code = default_string, .code_attribute.code_length = ARRAY_SIZE(default_string), .method = &method_info, }; cu = compilation_unit_alloc(&method); analyze_control_flow(cu); assert_int_equals(3, nr_bblocks(cu)); bb1 = bb_entry(cu->bb_list.next); bb2 = bb_entry(bb1->bb_list_node.next); bb3 = bb_entry(bb2->bb_list_node.next); assert_basic_block(cu, 0, 4, bb1); assert_basic_block(cu, 4, 7, bb2); assert_basic_block(cu, 7, 9, bb3); assert_basic_block_successors((struct basic_block*[]){bb2, bb3}, 2, bb1); assert_basic_block_successors((struct basic_block*[]){bb3 }, 1, bb2);
void test_convert_tableswitch_bbs1(void) { struct basic_block *bb0, *bb1, *bb2, *bb3, *bb4, *bb5, *bb6; struct compilation_unit *cu; struct cafebabe_method_info method_info; struct vm_method method = { .code_attribute.code = tableswitch1, .code_attribute.code_length = ARRAY_SIZE(tableswitch1), .method = &method_info, }; memset(&method_info, 0, sizeof(method_info)); cu = compilation_unit_alloc(&method); analyze_control_flow(cu); convert_to_ir(cu); assert_int_equals(7, nr_bblocks(cu)); bb0 = bb_entry(cu->bb_list.next); bb1 = bb_entry(bb0->bb_list_node.next); bb2 = bb_entry(bb1->bb_list_node.next); bb3 = bb_entry(bb2->bb_list_node.next); bb4 = bb_entry(bb3->bb_list_node.next); bb5 = bb_entry(bb4->bb_list_node.next); bb6 = bb_entry(bb5->bb_list_node.next); assert_basic_block_successors((struct basic_block*[]){bb6, bb1}, 2, bb0); assert_basic_block_successors((struct basic_block*[]){bb6, bb2}, 2, bb1);