Defer entry-point processing so that all potential uses of builtin's are found before culling the unused ones

This commit is contained in:
Imbris 2024-02-11 16:51:25 -05:00 committed by Teodor Tanasoaia
parent 6223af3860
commit 8b818a2076
2 changed files with 11 additions and 3 deletions

View File

@ -292,13 +292,13 @@ impl<I: Iterator<Item = u32>> super::Frontend<I> {
); );
if let Some(ep) = self.lookup_entry_point.remove(&fun_id) { if let Some(ep) = self.lookup_entry_point.remove(&fun_id) {
self.process_entry_point(module, ep, fun_id)?; self.deferred_entry_points.push((ep, fun_id));
} }
Ok(()) Ok(())
} }
fn process_entry_point( pub(super) fn process_entry_point(
&mut self, &mut self,
module: &mut crate::Module, module: &mut crate::Module,
ep: super::EntryPoint, ep: super::EntryPoint,

View File

@ -577,6 +577,9 @@ pub struct Frontend<I> {
lookup_function_type: FastHashMap<spirv::Word, LookupFunctionType>, lookup_function_type: FastHashMap<spirv::Word, LookupFunctionType>,
lookup_function: FastHashMap<spirv::Word, LookupFunction>, lookup_function: FastHashMap<spirv::Word, LookupFunction>,
lookup_entry_point: FastHashMap<spirv::Word, EntryPoint>, lookup_entry_point: FastHashMap<spirv::Word, EntryPoint>,
// When parsing functions, each entry point function gets an entry here so that additional
// processing for them can be performed after all function parsing.
deferred_entry_points: Vec<(EntryPoint, spirv::Word)>,
//Note: each `OpFunctionCall` gets a single entry here, indexed by the //Note: each `OpFunctionCall` gets a single entry here, indexed by the
// dummy `Handle<crate::Function>` of the call site. // dummy `Handle<crate::Function>` of the call site.
deferred_function_calls: Vec<spirv::Word>, deferred_function_calls: Vec<spirv::Word>,
@ -628,6 +631,7 @@ impl<I: Iterator<Item = u32>> Frontend<I> {
lookup_function_type: FastHashMap::default(), lookup_function_type: FastHashMap::default(),
lookup_function: FastHashMap::default(), lookup_function: FastHashMap::default(),
lookup_entry_point: FastHashMap::default(), lookup_entry_point: FastHashMap::default(),
deferred_entry_points: Vec::default(),
deferred_function_calls: Vec::default(), deferred_function_calls: Vec::default(),
dummy_functions: Arena::new(), dummy_functions: Arena::new(),
function_call_graph: GraphMap::new(), function_call_graph: GraphMap::new(),
@ -3954,7 +3958,11 @@ impl<I: Iterator<Item = u32>> Frontend<I> {
}?; }?;
} }
// TODO: clear unused builtin's here? // Do entry point specific processing after all functions are parsed so that we can
// cull unused problematic builtins of gl_PerVertex.
for (ep, fun_id) in core::mem::take(&mut self.deferred_entry_points) {
self.process_entry_point(&mut module, ep, fun_id)?;
}
log::info!("Patching..."); log::info!("Patching...");
{ {