From 248d64fc9d3c073e58ab4fd4a31b3df8638da1cd Mon Sep 17 00:00:00 2001 From: rarbore2 <rarbore2@illinois.edu> Date: Wed, 12 Feb 2025 14:12:15 -0600 Subject: [PATCH] Fix DC param ID identfication --- .gitignore | 1 + hercules_opt/src/inline.rs | 35 ++++++------- hercules_opt/src/interprocedural_sroa.rs | 26 +++++----- paper_resources/arr_sum_ir.dot | 49 ++++++++++++++++++ paper_resources/arr_sum_ir.pdf | Bin 0 -> 17654 bytes paper_resources/matmul_ir.dot | 61 +++++++++++++++++++++++ paper_resources/matmul_ir.pdf | Bin 0 -> 19165 bytes 7 files changed, 138 insertions(+), 34 deletions(-) create mode 100644 paper_resources/arr_sum_ir.dot create mode 100644 paper_resources/arr_sum_ir.pdf create mode 100644 paper_resources/matmul_ir.dot create mode 100644 paper_resources/matmul_ir.pdf diff --git a/.gitignore b/.gitignore index 87af5349..516108dd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /target *.dot +!paper_resources/*.dot *.bc *.out *.ll diff --git a/hercules_opt/src/inline.rs b/hercules_opt/src/inline.rs index 848d957f..f01b2366 100644 --- a/hercules_opt/src/inline.rs +++ b/hercules_opt/src/inline.rs @@ -24,21 +24,19 @@ pub fn inline(editors: &mut [FunctionEditor], callgraph: &CallGraph) { .map(|editor| collapse_returns(editor)) .collect(); - // Step 3: verify that each possible dynamic constant parameter index has a - // single unique dynamic constant ID. If this isn't true, dynamic constant - // substitution won't work, and this should be true anyway! - let mut found_idxs = HashMap::new(); - for id in editors[0].dynamic_constant_ids() { - let dc = editors[0].get_dynamic_constant(id); - if let DynamicConstant::Parameter(idx) = *dc { - assert!(!found_idxs.contains_key(&idx)); - found_idxs.insert(idx, id); - } - } - let mut dc_param_idx_to_dc_id = vec![]; - for idx in 0..found_idxs.len() { - dc_param_idx_to_dc_id.push(found_idxs[&idx]); - } + // Step 3: get dynamic constant IDs for parameters. + let max_num_dc_params = editors + .iter() + .map(|editor| editor.func().num_dynamic_constants) + .max() + .unwrap(); + let mut dc_args = vec![]; + editors[0].edit(|mut edit| { + dc_args = (0..max_num_dc_params as usize) + .map(|i| edit.add_dynamic_constant(DynamicConstant::Parameter(i))) + .collect(); + Ok(edit) + }); // Step 4: run inlining on each function individually. Iterate the functions // in topological order. @@ -49,12 +47,7 @@ pub fn inline(editors: &mut [FunctionEditor], callgraph: &CallGraph) { // 2. Shared references to all of the functions called by that function. let callees = callgraph.get_callees(to_inline_id); let editor_refs = get_mut_and_immuts(editors, to_inline_id, callees); - inline_func( - editor_refs.0, - editor_refs.1, - &single_return_nodes, - &dc_param_idx_to_dc_id, - ); + inline_func(editor_refs.0, editor_refs.1, &single_return_nodes, &dc_args); } } diff --git a/hercules_opt/src/interprocedural_sroa.rs b/hercules_opt/src/interprocedural_sroa.rs index b345f9bc..944ef8fd 100644 --- a/hercules_opt/src/interprocedural_sroa.rs +++ b/hercules_opt/src/interprocedural_sroa.rs @@ -235,18 +235,18 @@ fn compress_return_products(editors: &mut Vec<FunctionEditor>, all_callsites_edi // dc_param_idx_to_dc_id to get the id of the dynamic constants in the function, // and then replace dc_param_idx_to_dc_id[i] with call.dynamic_constants[i], // for all i. - let mut found_idxs = HashMap::new(); - for id in editors[0].dynamic_constant_ids() { - let dc = editors[0].get_dynamic_constant(id); - if let DynamicConstant::Parameter(idx) = *dc { - assert!(!found_idxs.contains_key(&idx)); - found_idxs.insert(idx, id); - } - } - let mut dc_param_idx_to_dc_id = vec![]; - for idx in 0..found_idxs.len() { - dc_param_idx_to_dc_id.push(found_idxs[&idx]); - } + let max_num_dc_params = editors + .iter() + .map(|editor| editor.func().num_dynamic_constants) + .max() + .unwrap(); + let mut dc_args = vec![]; + editors[0].edit(|mut edit| { + dc_args = (0..max_num_dc_params as usize) + .map(|i| edit.add_dynamic_constant(DynamicConstant::Parameter(i))) + .collect(); + Ok(edit) + }); // Step 2. Modify the return type of all editors corresponding to a function // for which we can edit every callsite, and the return type is a product. @@ -314,7 +314,7 @@ fn compress_return_products(editors: &mut Vec<FunctionEditor>, all_callsites_edi // a better abstraction around bulk replacement. let new_dcs = (*dynamic_constants).to_vec(); - let old_dcs = dc_param_idx_to_dc_id[..new_dcs.len()].to_vec(); + let old_dcs = dc_args[..new_dcs.len()].to_vec(); assert_eq!(old_dcs.len(), new_dcs.len()); let substs = old_dcs .into_iter() diff --git a/paper_resources/arr_sum_ir.dot b/paper_resources/arr_sum_ir.dot new file mode 100644 index 00000000..7479b259 --- /dev/null +++ b/paper_resources/arr_sum_ir.dot @@ -0,0 +1,49 @@ +digraph "Module" { +margin=0; +subgraph sum { +label="sum<1>" +style=invis +cluster=true +ranksep=1; +nodesep=1; +start_0_0 [xlabel=0, label=<Start<BR /><FONT POINT-SIZE="8">Control</FONT>>, color=darkred]; +parameter_0_1 [xlabel=1, label=<Parameter (#0)<BR /><FONT POINT-SIZE="8">Array(Float32, #0)</FONT>>, color=darkblue]; +dynamic_constant_0_2 [xlabel=2, label=<DynamicConstant (#0)<BR /><FONT POINT-SIZE="8">UnsignedInteger64</FONT>>, color=darkblue]; +projection_0_3 [xlabel=3, label=<Projection<BR /><FONT POINT-SIZE="8">Control</FONT>>, color=darkred]; +add_0_4 [xlabel=4, label=<Add<BR /><FONT POINT-SIZE="8">UnsignedInteger64</FONT>>, color=darkblue]; +add_0_5 [xlabel=5, label=<Add<BR /><FONT POINT-SIZE="8">Float32</FONT>>, color=darkblue]; +read_0_6 [xlabel=6, label=<Read<BR /><FONT POINT-SIZE="8">Float32</FONT>>, color=darkblue]; +lt_0_7 [xlabel=7, label=<LT<BR /><FONT POINT-SIZE="8">Boolean</FONT>>, color=darkblue]; +if_0_8 [xlabel=8, label=<If<BR /><FONT POINT-SIZE="8">Control</FONT>>, color=darkred]; +projection_0_9 [xlabel=9, label=<Projection<BR /><FONT POINT-SIZE="8">Control</FONT>>, color=darkred]; +return_0_10 [xlabel=10, label=<Return>, color=darkred]; +constant_0_11 [xlabel=11, label=<Constant (0)<BR /><FONT POINT-SIZE="8">UnsignedInteger64</FONT>>, color=darkblue]; +constant_0_12 [xlabel=12, label=<Constant (1)<BR /><FONT POINT-SIZE="8">UnsignedInteger64</FONT>>, color=darkblue]; +constant_0_13 [xlabel=13, label=<Constant (0)<BR /><FONT POINT-SIZE="8">Float32</FONT>>, color=darkblue]; +phi_0_14 [xlabel=14, label=<Phi<BR /><FONT POINT-SIZE="8">UnsignedInteger64</FONT>>, color=darkblue]; +phi_0_15 [xlabel=15, label=<Phi<BR /><FONT POINT-SIZE="8">Float32</FONT>>, color=darkblue]; +region_0_16 [xlabel=16, label=<Region<BR /><FONT POINT-SIZE="8">Control</FONT>>, color=darkred]; +if_0_8 -> projection_0_3 [color=black, style="dashed"]; +phi_0_14 -> add_0_4 [color=black, style=""]; +constant_0_12 -> add_0_4 [color=black, style=""]; +phi_0_15 -> add_0_5 [color=black, style=""]; +read_0_6 -> add_0_5 [color=black, style=""]; +parameter_0_1 -> read_0_6 [color=black, style=""]; +phi_0_14 -> read_0_6 [color=black, style=""]; +add_0_4 -> lt_0_7 [color=black, style=""]; +dynamic_constant_0_2 -> lt_0_7 [color=black, style=""]; +if_0_8 -> region_0_16 [dir=back, color=black, style="dashed"]; +lt_0_7 -> if_0_8 [color=black, style="dotted"]; +if_0_8 -> projection_0_9 [color=black, style="dashed"]; +projection_0_9 -> return_0_10 [color=black, style="dashed"]; +add_0_5 -> return_0_10 [color=black, style="dotted"]; +constant_0_11 -> phi_0_14 [color=black, style=""]; +phi_0_14 -> add_0_4 [dir=back, color=black, style=""]; +region_0_16 -> phi_0_14 [color=black, style="dotted"]; +constant_0_13 -> phi_0_15 [color=black, style=""]; +add_0_5 -> phi_0_15 [color=black, style=""]; +region_0_16 -> phi_0_15 [color=black, style="dotted"]; +start_0_0 -> region_0_16 [color=black, style="dashed"]; +projection_0_3 -> region_0_16 [color=black, style="dashed"]; +} +} diff --git a/paper_resources/arr_sum_ir.pdf b/paper_resources/arr_sum_ir.pdf new file mode 100644 index 0000000000000000000000000000000000000000..61c5e4314dd3a4a61064e228fc6ec50acc17232c GIT binary patch literal 17654 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 b^m=hgVo^y&5ztqL<|YOvT&k+B{%%|V9i0^- literal 0 HcmV?d00001 diff --git a/paper_resources/matmul_ir.dot b/paper_resources/matmul_ir.dot new file mode 100644 index 00000000..ab3f4464 --- /dev/null +++ b/paper_resources/matmul_ir.dot @@ -0,0 +1,61 @@ +digraph "Module" { +margin=0; +subgraph matmul { +label="matmul<3>" +style=invis +cluster=true +ranksep=1; +nodesep=1; +start_0_0 [xlabel=0, label=<Start<BR /><FONT POINT-SIZE="8">Control</FONT>>, color=darkred]; +parameter_0_1 [xlabel=1, label=<Parameter (#0)<BR /><FONT POINT-SIZE="8">Array(Integer32, #0, #1)</FONT>>, color=darkblue]; +parameter_0_2 [xlabel=2, label=<Parameter (#1)<BR /><FONT POINT-SIZE="8">Array(Integer32, #1, #2)</FONT>>, color=darkblue]; +fork_0_3 [xlabel=3, label=<Fork (#0, #2)<BR /><FONT POINT-SIZE="8">Control</FONT><BR /><FONT POINT-SIZE="8">ParallelFork</FONT>>, color=darkred]; +thread_id_0_4 [xlabel=4, label=<ThreadID (0)<BR /><FONT POINT-SIZE="8">UnsignedInteger64</FONT>>, color=darkblue]; +thread_id_0_5 [xlabel=5, label=<ThreadID (1)<BR /><FONT POINT-SIZE="8">UnsignedInteger64</FONT>>, color=darkblue]; +fork_0_6 [xlabel=6, label=<Fork (#1)<BR /><FONT POINT-SIZE="8">Control</FONT><BR /><FONT POINT-SIZE="8">Vectorizable</FONT>>, color=darkred]; +thread_id_0_7 [xlabel=7, label=<ThreadID (0)<BR /><FONT POINT-SIZE="8">UnsignedInteger64</FONT>>, color=darkblue]; +join_0_8 [xlabel=8, label=<Join<BR /><FONT POINT-SIZE="8">Control</FONT>>, color=darkred]; +join_0_9 [xlabel=9, label=<Join<BR /><FONT POINT-SIZE="8">Control</FONT>>, color=darkred]; +reduce_0_10 [xlabel=10, label=<Reduce<BR /><FONT POINT-SIZE="8">Array(Integer32, #0, #2)</FONT><BR /><FONT POINT-SIZE="8">ParallelReduce</FONT>>, color=darkblue]; +return_0_11 [xlabel=11, label=<Return>, color=darkred]; +read_0_12 [xlabel=12, label=<Read<BR /><FONT POINT-SIZE="8">Integer32</FONT>>, color=darkblue]; +read_0_13 [xlabel=13, label=<Read<BR /><FONT POINT-SIZE="8">Integer32</FONT>>, color=darkblue]; +mul_0_14 [xlabel=14, label=<Mul<BR /><FONT POINT-SIZE="8">Integer32</FONT>>, color=darkblue]; +reduce_0_15 [xlabel=15, label=<Reduce<BR /><FONT POINT-SIZE="8">Integer32</FONT><BR /><FONT POINT-SIZE="8">TightAssociative</FONT>>, color=darkblue]; +add_0_16 [xlabel=16, label=<Add<BR /><FONT POINT-SIZE="8">Integer32</FONT>>, color=darkblue]; +write_0_17 [xlabel=17, label=<Write<BR /><FONT POINT-SIZE="8">Array(Integer32, #0, #2)</FONT>>, color=darkblue]; +constant_0_18 [xlabel=18, label=<Constant ([])<BR /><FONT POINT-SIZE="8">Array(Integer32, #0, #2)</FONT><BR /><FONT POINT-SIZE="8">NoResetConstant</FONT>>, color=darkblue]; +constant_0_19 [xlabel=19, label=<Constant (0)<BR /><FONT POINT-SIZE="8">Integer32</FONT>>, color=darkblue]; +start_0_0 -> fork_0_3 [color=black, style="dashed"]; +fork_0_3 -> thread_id_0_4 [color=black, style="dotted"]; +fork_0_3 -> thread_id_0_5 [color=black, style="dotted"]; +fork_0_3 -> fork_0_6 [color=black, style="dashed"]; +fork_0_6 -> thread_id_0_7 [color=black, style="dotted"]; +fork_0_6 -> join_0_8 [color=black, style="dashed"]; +join_0_8 -> join_0_9 [color=black, style="dashed"]; +join_0_9 -> reduce_0_10 [color=black, style="dotted"]; +constant_0_18 -> reduce_0_10 [color=black, style=""]; +write_0_17 -> reduce_0_10 [color=black, style=""]; +join_0_9 -> return_0_11 [color=black, style="dashed"]; +reduce_0_10 -> return_0_11 [color=black, style="dotted"]; +parameter_0_1 -> read_0_12 [color=black, style=""]; +thread_id_0_4 -> read_0_12 [color=black, style=""]; +thread_id_0_7 -> read_0_12 [color=black, style=""]; +parameter_0_2 -> read_0_13 [color=black, style=""]; +thread_id_0_7 -> read_0_13 [color=black, style=""]; +thread_id_0_5 -> read_0_13 [color=black, style=""]; +read_0_12 -> mul_0_14 [color=black, style=""]; +read_0_13 -> mul_0_14 [color=black, style=""]; +join_0_8 -> reduce_0_15 [color=black, style="dotted"]; +constant_0_19 -> reduce_0_15 [color=black, style=""]; +add_0_16 -> reduce_0_15 [color=black, style=""]; +mul_0_14 -> add_0_16 [color=black, style=""]; +reduce_0_15 -> add_0_16 [color=black, style=""]; +reduce_0_10 -> write_0_17 [color=black, style=""]; +reduce_0_15 -> write_0_17 [color=black, style=""]; +thread_id_0_4 -> write_0_17 [color=black, style=""]; +thread_id_0_5 -> write_0_17 [color=black, style=""]; +parameter_0_1 -> thread_id_0_4 [style=invis]; +parameter_0_2 -> thread_id_0_5 [style=invis]; +} +} diff --git a/paper_resources/matmul_ir.pdf b/paper_resources/matmul_ir.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f4afd5892deada4c5997fdeb80f34cc5aeacbdb3 GIT binary patch literal 19165 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 literal 0 HcmV?d00001 -- GitLab