data_access_analysis
The data access analysis computes:
- -‘data_access_patterns’ which represent that the address ‘Address’ is
accessed with size ‘Size’ and multiplier ‘Multiplier’ from an instruction in ‘FromWhere’.
- -‘preferred_data_access’ the address is most likely accessed from the data access
pattern located at ea_data_access.
data_access_patterns are computed by checking memory accesses and with the help of the value analysis.
data_access_patterns give us very sparse information, but if an address ‘ea’ is accessed with a multiplier, it is likely that ‘ea’+multiplier, ‘ea’+2*multiplier, etc are also accessed the same way. Unfortunately, we do not know until when. Therefore, we propagate these accesses using the multiplier until we reach some other access.
- instruction_memory_access_size(EA:address, Op_index:operand_index, Size:unsigned)
Uses:
arch.data_access_size,instruction,instruction_get_dest_op,instruction_get_op,op_indirect,op_regdirectUsed by:
arch.alignment_requiredRecursive:
arm_jump_table_block_instruction,stack_def_use.live_var_at_prior_used,possible_target_from,data_access,stack_def_use.ref_in_block,code_in_block_candidate,candidate_block_is_padding,relocation_adjustment,data_in_code,cmp_reg_to_reg,__agg_single3,jump_table_candidate_refined,invalid,inferred_main_in_reg,base_relative_operand,relative_address,wis_has_prior,compare_and_jump_indirect_op_valid,litpool_confidence,block_boundaries,resolved_reaches,indexed_pc_relative_load_relative,unresolved_block,split_load_for_symbolization,base_relative_jump,last_value_reg_limit,instruction_memory_access_size,plt_block,straight_line_last_def,__agg_subclause2,symbol_minus_symbol_litpool_access_pattern,jump_table_element_access,block_points,const_value_reg_used,reg_reg_arithmetic_operation_defs,stack_def_use.live_var_def,stack_def_use.live_var_used_in_block,composite_data_access,jump_table_target,value_reg_limit,block_candidate_dependency_edge,tls_get_addr,indefinite_litpool_ref,reg_def_use.used_in_block,simple_data_access_pattern,arch.simple_data_load,split_load,value_reg,stack_def_use.live_var_at_block_end,block_limit,arm_jump_table_data_block,value_reg_unsupported,stack_def_use.last_def_in_block,overlapping_instruction,next_start,block,wis_memo,next_type,cinf_ldr_add_pc,possible_target,relative_jump_table_entry_candidate,arm_jump_table_data_block_limit,reg_def_use.last_def_in_block,__agg_subclause6,stack_def_use.live_var_used,def_used_for_address,known_block,contains_plausible_instr_seq,reg_def_use.live_var_at_block_end,arch.reg_relative_load,split_load_point,candidate_block_is_not_padding,split_load_candidate,split_load_conflict,incomplete_block,wis_schedule_iter,reg_def_use.defined_in_block,__agg_subclause3,reg_def_use.ref_in_block,contains_implausible_instr_seq,base_relative_operation,negative_block_heuristic,no_return_call,reg_def_use.used,block_total_points,reg_def_use.block_last_def,discarded_block,reg_has_base_image,no_return_call_propagated,block_points_proportional,nop_in_padding_candidate,reg_def_use.live_var_used,block_heuristic,litpool_ref,after_end,reg_def_use.flow_def,transition_block_limit,unresolved_interval_order,cmp_defines,block_last_instruction,block_overlap,jump_table_max,arch.extend_load,reg_def_use.ambiguous_last_def_in_block,arm_jump_table_skip_first_entry,impossible_block,hi_load_prop,block_candidate_boundaries,is_padding,may_fallthrough,gp_relative_operand,segment_target_range,arm_jump_table_candidate_start,discarded_split_load,arm_jump_table_cmp_limit,first_block_in_byte_interval,arm_jump_table_candidate,jump_table_signed,stack_def_use.used_in_block,no_value_reg_limit,tls_desc_call,reg_used_for,branch_to_calculated_pc_rel_addr,__agg_single2,init_symbol_minus_symbol_candidate_arm,data_block_candidate,start_function,basic_target,reg_def_use.return_val_used,padding_block_limit,straight_line_def_used,data_block_limit,reg_def_use.ambiguous_block_last_def,wis_prior,stack_def_use.def_used,split_load_operand,init_ldr_add_pc,got_relative_operand,next_block_in_byte_interval,data_in_code_propagate,no_return_call_refined,call_tls_get_addr,inferred_main_dispatch,reg_def_use.def_used,must_fallthrough,block_next,value_reg_edge,unlikely_have_symbolic_immediate,adjusts_stack_in_block,self_contained_segment,block_implies_block,__agg_subclause7,__agg_single6,stack_def_use.defined_in_block,relocation_adjustment_total,compare_and_jump_indirect,flags_and_jump_pair,jump_table_candidate,function_inference.function_entry_initial,invalid_jump_table_candidate,reg_def_use.return_block_end,plt_entry,jump_table_start,reg_has_got,code_in_block_candidate_refined,code_in_block,no_return_block,unresolved_interval,litpool_symbolic_operand,split_load_total_points,unresolved_block_overlap,symbolic_expr_from_relocation,compare_and_jump_register,indexed_pc_relative_load,reg_def_use.live_var_def,arm_jump_table_block_start,overlap_with_litpool,compare_and_jump_immediate,initialized_data_segment,litpool_boundaries,padding_block_candidate,relative_address_start,stack_def_use.block_last_def,jump_table_prelude,correlated_live_reg,inter_procedural_edge,likely_fallthrough,adrp_used,next_end,common_tail,wis_schedule,stack_base_reg_move,reg_def_use.live_var_at_prior_used,data_segment,block_instruction_next
- data_access(EA:address, Op_index:operand_index, RegSegment:reg_nullable, RegBase:reg_nullable, RegIndex:reg_nullable, Mult:number, Offset:number, Size:unsigned)
Used by:
addr_outside_section_used_for_memory_access,data_access_pattern_candidate,dest_enlarged_data_section,jump_table,moved_displacement_candidate,moved_label_class,value_reg_at_operand,value_reg_at_operand_loopRecursive:
arm_jump_table_block_instruction,stack_def_use.live_var_at_prior_used,possible_target_from,data_access,stack_def_use.ref_in_block,code_in_block_candidate,candidate_block_is_padding,relocation_adjustment,data_in_code,cmp_reg_to_reg,__agg_single3,jump_table_candidate_refined,invalid,inferred_main_in_reg,base_relative_operand,relative_address,wis_has_prior,compare_and_jump_indirect_op_valid,litpool_confidence,block_boundaries,resolved_reaches,indexed_pc_relative_load_relative,unresolved_block,split_load_for_symbolization,base_relative_jump,last_value_reg_limit,instruction_memory_access_size,plt_block,straight_line_last_def,__agg_subclause2,symbol_minus_symbol_litpool_access_pattern,jump_table_element_access,block_points,const_value_reg_used,reg_reg_arithmetic_operation_defs,stack_def_use.live_var_def,stack_def_use.live_var_used_in_block,composite_data_access,jump_table_target,value_reg_limit,block_candidate_dependency_edge,tls_get_addr,indefinite_litpool_ref,reg_def_use.used_in_block,simple_data_access_pattern,arch.simple_data_load,split_load,value_reg,stack_def_use.live_var_at_block_end,block_limit,arm_jump_table_data_block,value_reg_unsupported,stack_def_use.last_def_in_block,overlapping_instruction,next_start,block,wis_memo,next_type,cinf_ldr_add_pc,possible_target,relative_jump_table_entry_candidate,arm_jump_table_data_block_limit,reg_def_use.last_def_in_block,__agg_subclause6,stack_def_use.live_var_used,def_used_for_address,known_block,contains_plausible_instr_seq,reg_def_use.live_var_at_block_end,arch.reg_relative_load,split_load_point,candidate_block_is_not_padding,split_load_candidate,split_load_conflict,incomplete_block,wis_schedule_iter,reg_def_use.defined_in_block,__agg_subclause3,reg_def_use.ref_in_block,contains_implausible_instr_seq,base_relative_operation,negative_block_heuristic,no_return_call,reg_def_use.used,block_total_points,reg_def_use.block_last_def,discarded_block,reg_has_base_image,no_return_call_propagated,block_points_proportional,nop_in_padding_candidate,reg_def_use.live_var_used,block_heuristic,litpool_ref,after_end,reg_def_use.flow_def,transition_block_limit,unresolved_interval_order,cmp_defines,block_last_instruction,block_overlap,jump_table_max,arch.extend_load,reg_def_use.ambiguous_last_def_in_block,arm_jump_table_skip_first_entry,impossible_block,hi_load_prop,block_candidate_boundaries,is_padding,may_fallthrough,gp_relative_operand,segment_target_range,arm_jump_table_candidate_start,discarded_split_load,arm_jump_table_cmp_limit,first_block_in_byte_interval,arm_jump_table_candidate,jump_table_signed,stack_def_use.used_in_block,no_value_reg_limit,tls_desc_call,reg_used_for,branch_to_calculated_pc_rel_addr,__agg_single2,init_symbol_minus_symbol_candidate_arm,data_block_candidate,start_function,basic_target,reg_def_use.return_val_used,padding_block_limit,straight_line_def_used,data_block_limit,reg_def_use.ambiguous_block_last_def,wis_prior,stack_def_use.def_used,split_load_operand,init_ldr_add_pc,got_relative_operand,next_block_in_byte_interval,data_in_code_propagate,no_return_call_refined,call_tls_get_addr,inferred_main_dispatch,reg_def_use.def_used,must_fallthrough,block_next,value_reg_edge,unlikely_have_symbolic_immediate,adjusts_stack_in_block,self_contained_segment,block_implies_block,__agg_subclause7,__agg_single6,stack_def_use.defined_in_block,relocation_adjustment_total,compare_and_jump_indirect,flags_and_jump_pair,jump_table_candidate,function_inference.function_entry_initial,invalid_jump_table_candidate,reg_def_use.return_block_end,plt_entry,jump_table_start,reg_has_got,code_in_block_candidate_refined,code_in_block,no_return_block,unresolved_interval,litpool_symbolic_operand,split_load_total_points,unresolved_block_overlap,symbolic_expr_from_relocation,compare_and_jump_register,indexed_pc_relative_load,reg_def_use.live_var_def,arm_jump_table_block_start,overlap_with_litpool,compare_and_jump_immediate,initialized_data_segment,litpool_boundaries,padding_block_candidate,relative_address_start,stack_def_use.block_last_def,jump_table_prelude,correlated_live_reg,inter_procedural_edge,likely_fallthrough,adrp_used,next_end,common_tail,wis_schedule,stack_base_reg_move,reg_def_use.live_var_at_prior_used,data_segment,block_instruction_next
- value_reg_at_operand(EA:address, Op_index:operand_index, Reg:reg_nullable, EA_from:address, Mult:number, Offset:number, Type:symbol)
- value_reg_at_operand_loop(EA:address, Op_index:operand_index, Reg:reg_nullable, EA_from:address, Mult:number, Offset:number, Type:symbol)
- data_access_pattern(Address:address, Size:unsigned, Multiplier:number, FromWhere:address)
The address ‘Address’ is accessed from an instruction at address ‘FromWhere’. The access has size ‘Size’ and uses a multiplier ‘Multiplier’.
- data_access_pattern_candidate(Address:address, Size:unsigned, Multiplier:number, FromWhere:address)
Auxiliary predicate that computes initial approximation of
data_access_pattern
- simple_data_access_pattern(Address:address, Op_index:unsigned, Size:unsigned, FromWhere:address)
The address
Addressis accessed from instruction at addressFromWhere. The access is done from operandOp_indexand has sizeSize.simple_data_access_patternis a subset ofdata_access_pattern_candidatethat can be computed without using the value register analysis.Used by:
data_access_pattern_candidateRecursive:
arm_jump_table_block_instruction,stack_def_use.live_var_at_prior_used,possible_target_from,data_access,stack_def_use.ref_in_block,code_in_block_candidate,candidate_block_is_padding,relocation_adjustment,data_in_code,cmp_reg_to_reg,__agg_single3,jump_table_candidate_refined,invalid,inferred_main_in_reg,base_relative_operand,relative_address,wis_has_prior,compare_and_jump_indirect_op_valid,litpool_confidence,block_boundaries,resolved_reaches,indexed_pc_relative_load_relative,unresolved_block,split_load_for_symbolization,base_relative_jump,last_value_reg_limit,instruction_memory_access_size,plt_block,straight_line_last_def,__agg_subclause2,symbol_minus_symbol_litpool_access_pattern,jump_table_element_access,block_points,const_value_reg_used,reg_reg_arithmetic_operation_defs,stack_def_use.live_var_def,stack_def_use.live_var_used_in_block,composite_data_access,jump_table_target,value_reg_limit,block_candidate_dependency_edge,tls_get_addr,indefinite_litpool_ref,reg_def_use.used_in_block,simple_data_access_pattern,arch.simple_data_load,split_load,value_reg,stack_def_use.live_var_at_block_end,block_limit,arm_jump_table_data_block,value_reg_unsupported,stack_def_use.last_def_in_block,overlapping_instruction,next_start,block,wis_memo,next_type,cinf_ldr_add_pc,possible_target,relative_jump_table_entry_candidate,arm_jump_table_data_block_limit,reg_def_use.last_def_in_block,__agg_subclause6,stack_def_use.live_var_used,def_used_for_address,known_block,contains_plausible_instr_seq,reg_def_use.live_var_at_block_end,arch.reg_relative_load,split_load_point,candidate_block_is_not_padding,split_load_candidate,split_load_conflict,incomplete_block,wis_schedule_iter,reg_def_use.defined_in_block,__agg_subclause3,reg_def_use.ref_in_block,contains_implausible_instr_seq,base_relative_operation,negative_block_heuristic,no_return_call,reg_def_use.used,block_total_points,reg_def_use.block_last_def,discarded_block,reg_has_base_image,no_return_call_propagated,block_points_proportional,nop_in_padding_candidate,reg_def_use.live_var_used,block_heuristic,litpool_ref,after_end,reg_def_use.flow_def,transition_block_limit,unresolved_interval_order,cmp_defines,block_last_instruction,block_overlap,jump_table_max,arch.extend_load,reg_def_use.ambiguous_last_def_in_block,arm_jump_table_skip_first_entry,impossible_block,hi_load_prop,block_candidate_boundaries,is_padding,may_fallthrough,gp_relative_operand,segment_target_range,arm_jump_table_candidate_start,discarded_split_load,arm_jump_table_cmp_limit,first_block_in_byte_interval,arm_jump_table_candidate,jump_table_signed,stack_def_use.used_in_block,no_value_reg_limit,tls_desc_call,reg_used_for,branch_to_calculated_pc_rel_addr,__agg_single2,init_symbol_minus_symbol_candidate_arm,data_block_candidate,start_function,basic_target,reg_def_use.return_val_used,padding_block_limit,straight_line_def_used,data_block_limit,reg_def_use.ambiguous_block_last_def,wis_prior,stack_def_use.def_used,split_load_operand,init_ldr_add_pc,got_relative_operand,next_block_in_byte_interval,data_in_code_propagate,no_return_call_refined,call_tls_get_addr,inferred_main_dispatch,reg_def_use.def_used,must_fallthrough,block_next,value_reg_edge,unlikely_have_symbolic_immediate,adjusts_stack_in_block,self_contained_segment,block_implies_block,__agg_subclause7,__agg_single6,stack_def_use.defined_in_block,relocation_adjustment_total,compare_and_jump_indirect,flags_and_jump_pair,jump_table_candidate,function_inference.function_entry_initial,invalid_jump_table_candidate,reg_def_use.return_block_end,plt_entry,jump_table_start,reg_has_got,code_in_block_candidate_refined,code_in_block,no_return_block,unresolved_interval,litpool_symbolic_operand,split_load_total_points,unresolved_block_overlap,symbolic_expr_from_relocation,compare_and_jump_register,indexed_pc_relative_load,reg_def_use.live_var_def,arm_jump_table_block_start,overlap_with_litpool,compare_and_jump_immediate,initialized_data_segment,litpool_boundaries,padding_block_candidate,relative_address_start,stack_def_use.block_last_def,jump_table_prelude,correlated_live_reg,inter_procedural_edge,likely_fallthrough,adrp_used,next_end,common_tail,wis_schedule,stack_base_reg_move,reg_def_use.live_var_at_prior_used,data_segment,block_instruction_next
- preferred_data_access(EA:address, Size:unsigned, AccessEA:address)
The address at ‘EA’ is probably accessed with size ‘Size’ using the same pattern as the data access in ‘AccessEA’. Preferred data accesses are computed by propagating data accesses based on their multiplier.
Uses:
data_access_pattern,data_access_pattern_non_zero,next_dyssynchronous_data_accessRecursive:
symbol_score,discarded_jump_table_entry,symbolic_data,split_block,+disconnected3,data_limit,data_object_conflict,discarded_data_object,moved_pc_relative_candidate,inferred_special_symbol,symbol_minus_symbol_from_relocation,best_symexpr_symbol,preferred_data_access,symbolic_expr,data_limit_after_access,symbolic_expr_attribute,next_address_in_data,symbolic_operand,symbol_minus_symbol,code_in_split_block,inferred_main_function,resolved_transfer,base_relative_symbolic_operand,label_conflict,relative_jump_table_entry,data_access_limit,function_inference.function_entry,+disconnected6,string_candidate_refined,+disconnected2,moved_label_candidate,moved_label,moved_displacement_candidate,symbolic_operand_point,data_object_candidate,data_object,value_reg_address_before,block_needs_merging,data_object_total_points,data_object_point,symbol_minus_symbol_candidate,address_array_aux,symbolic_operand_attribute,main_function,address_array,labeled_ea,best_func_symbol,next_data_limit,moved_data_label,labeled_data_candidate,boundary_sym_expr,+disconnected1,refined_block,jump_table,block_needs_splitting_at,got_reference,code_in_refined_block,symbolic_expr_symbol_minus_symbol,code_pointer_in_data,string_candidate,after_address_in_data
- data_access_pattern_candidate_refined(Address:address, Size:unsigned, Multiplier:number, FromWhere:address)
Filter out some invalid DAP candidates before performing expensive aggregation
- dap_location(Address:address, Size:unsigned)
Unique DAP Address,Size pairs at which the max must be evaluated.
Prevents evaluating the max for each non-unique copy of the pair.
Used by:
dap_max_mult
- dap_max_mult(Address:address, Size:unsigned, Max:number)
The largest multiplier for each Address,Size combination among the data access pattern candidates
Used by:
data_access_pattern
- data_access_limit(EA:address)
Data limits are the candidates for labeled data and the boundaries of data segments.
Uses:
data_access_pattern_non_zero,data_segment,repeated_byteRecursive:
symbol_score,discarded_jump_table_entry,symbolic_data,split_block,+disconnected3,data_limit,data_object_conflict,discarded_data_object,moved_pc_relative_candidate,inferred_special_symbol,symbol_minus_symbol_from_relocation,best_symexpr_symbol,preferred_data_access,symbolic_expr,data_limit_after_access,symbolic_expr_attribute,next_address_in_data,symbolic_operand,symbol_minus_symbol,code_in_split_block,inferred_main_function,resolved_transfer,base_relative_symbolic_operand,label_conflict,relative_jump_table_entry,data_access_limit,function_inference.function_entry,+disconnected6,string_candidate_refined,+disconnected2,moved_label_candidate,moved_label,moved_displacement_candidate,symbolic_operand_point,data_object_candidate,data_object,value_reg_address_before,block_needs_merging,data_object_total_points,data_object_point,symbol_minus_symbol_candidate,address_array_aux,symbolic_operand_attribute,main_function,address_array,labeled_ea,best_func_symbol,next_data_limit,moved_data_label,labeled_data_candidate,boundary_sym_expr,+disconnected1,refined_block,jump_table,block_needs_splitting_at,got_reference,code_in_refined_block,symbolic_expr_symbol_minus_symbol,code_pointer_in_data,string_candidate,after_address_in_data
- data_limit(EA:address)
Labeled data boundaries
Uses:
data_segmentRecursive:
symbol_score,discarded_jump_table_entry,symbolic_data,split_block,+disconnected3,data_limit,data_object_conflict,discarded_data_object,moved_pc_relative_candidate,inferred_special_symbol,symbol_minus_symbol_from_relocation,best_symexpr_symbol,preferred_data_access,symbolic_expr,data_limit_after_access,symbolic_expr_attribute,next_address_in_data,symbolic_operand,symbol_minus_symbol,code_in_split_block,inferred_main_function,resolved_transfer,base_relative_symbolic_operand,label_conflict,relative_jump_table_entry,data_access_limit,function_inference.function_entry,+disconnected6,string_candidate_refined,+disconnected2,moved_label_candidate,moved_label,moved_displacement_candidate,symbolic_operand_point,data_object_candidate,data_object,value_reg_address_before,block_needs_merging,data_object_total_points,data_object_point,symbol_minus_symbol_candidate,address_array_aux,symbolic_operand_attribute,main_function,address_array,labeled_ea,best_func_symbol,next_data_limit,moved_data_label,labeled_data_candidate,boundary_sym_expr,+disconnected1,refined_block,jump_table,block_needs_splitting_at,got_reference,code_in_refined_block,symbolic_expr_symbol_minus_symbol,code_pointer_in_data,string_candidate,after_address_in_data
- next_data_limit(EA:address, Next:address)
The next data limit after ‘EA’ is at ‘Next’.
Uses:
data_segmentRecursive:
symbol_score,discarded_jump_table_entry,symbolic_data,split_block,+disconnected3,data_limit,data_object_conflict,discarded_data_object,moved_pc_relative_candidate,inferred_special_symbol,symbol_minus_symbol_from_relocation,best_symexpr_symbol,preferred_data_access,symbolic_expr,data_limit_after_access,symbolic_expr_attribute,next_address_in_data,symbolic_operand,symbol_minus_symbol,code_in_split_block,inferred_main_function,resolved_transfer,base_relative_symbolic_operand,label_conflict,relative_jump_table_entry,data_access_limit,function_inference.function_entry,+disconnected6,string_candidate_refined,+disconnected2,moved_label_candidate,moved_label,moved_displacement_candidate,symbolic_operand_point,data_object_candidate,data_object,value_reg_address_before,block_needs_merging,data_object_total_points,data_object_point,symbol_minus_symbol_candidate,address_array_aux,symbolic_operand_attribute,main_function,address_array,labeled_ea,best_func_symbol,next_data_limit,moved_data_label,labeled_data_candidate,boundary_sym_expr,+disconnected1,refined_block,jump_table,block_needs_splitting_at,got_reference,code_in_refined_block,symbolic_expr_symbol_minus_symbol,code_pointer_in_data,string_candidate,after_address_in_data
- data_limit_after_access(Access:address, DataLimit:address)
The first data limit after the data access at address ‘Access’ is at address ‘DataLimit’.
Uses:
data_access_pattern,data_segmentRecursive:
symbol_score,discarded_jump_table_entry,symbolic_data,split_block,+disconnected3,data_limit,data_object_conflict,discarded_data_object,moved_pc_relative_candidate,inferred_special_symbol,symbol_minus_symbol_from_relocation,best_symexpr_symbol,preferred_data_access,symbolic_expr,data_limit_after_access,symbolic_expr_attribute,next_address_in_data,symbolic_operand,symbol_minus_symbol,code_in_split_block,inferred_main_function,resolved_transfer,base_relative_symbolic_operand,label_conflict,relative_jump_table_entry,data_access_limit,function_inference.function_entry,+disconnected6,string_candidate_refined,+disconnected2,moved_label_candidate,moved_label,moved_displacement_candidate,symbolic_operand_point,data_object_candidate,data_object,value_reg_address_before,block_needs_merging,data_object_total_points,data_object_point,symbol_minus_symbol_candidate,address_array_aux,symbolic_operand_attribute,main_function,address_array,labeled_ea,best_func_symbol,next_data_limit,moved_data_label,labeled_data_candidate,boundary_sym_expr,+disconnected1,refined_block,jump_table,block_needs_splitting_at,got_reference,code_in_refined_block,symbolic_expr_symbol_minus_symbol,code_pointer_in_data,string_candidate,after_address_in_data
- next_data_access(EA:address, Next:address)
The next data access after the one at ‘EA’ is at ‘Next’.
Uses:
data_access_pattern,data_segmentUsed by:
next_dyssynchronous_data_access,synchronous_access
- data_access_pattern_non_zero(Address:address, Size:unsigned, Multiplier:unsigned, FromWhere:address)
Uses:
data_access_patternUsed by:
data_access_limit,preferred_data_access,synchronous_access
- synchronous_access_barrier(EA:address)
Barriers are the candidates for limiting synchronous access pairing.
Uses:
data_segment,symbol
- synchronous_access_barrier_after_access(EA:address, Barrier:address)
The first synchronous_access barrier after the data access to ‘EA’ is at address ‘Barrier’.
Used by:
synchronous_access
- synchronous_access(RefAccess:address, LastEA:address)
Two data accesses are synchronous if: 1. The second access has multiplier 0 and it originates from the same address
as the first.
Or, They have the same multiplier and the space between them
means they do not collide with each other even if they are propagated.
synchronous_accessdenotes that the access atRefAccessis synchronous with all the accesses fromRefAccesstoLastEA. For example, if we have the consecutive accesses: A, B, C, D. synchronous_access(A,D) means that A is synchronous with B, C and D.Note that if synchronous_access(A,D) is generated, so will synchronous_access(A,B) and synchronous_access(A,C) since the computation is incremental. We could use subsumption to remove those intermediate results but that would require reworking
first_synchronous_accessas well.
- first_synchronous_access(Ref:address, Access:address)
The first synchronous data access of ‘Access’ is located at address ‘Ref’.
Uses:
synchronous_accessUsed by:
moved_label_candidate,moved_label_class
- next_dyssynchronous_data_access(EA:address, Next:address)
The next data access after ‘EA’ that is not synchronous with ‘EA’ is located at address ‘Next’.
Uses:
data_access_pattern,next_data_access,synchronous_accessUsed by:
preferred_data_access