From cb5e10d0aacb3110d9972f1f6736a2902cfbd01f Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 26 Jul 2024 17:05:43 -0500 Subject: [PATCH] nak/nir: Add a few more NIR helpers Part-of: --- src/nouveau/compiler/nak/nir.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/nouveau/compiler/nak/nir.rs b/src/nouveau/compiler/nak/nir.rs index d22bf70452c..971d679f77d 100644 --- a/src/nouveau/compiler/nak/nir.rs +++ b/src/nouveau/compiler/nak/nir.rs @@ -570,6 +570,7 @@ pub trait NirBlock { fn successors(&self) -> [Option<&nir_block>; 2]; fn following_if(&self) -> Option<&nir_if>; fn following_loop(&self) -> Option<&nir_loop>; + fn parent(&self) -> &nir_cf_node; } impl NirBlock for nir_block { @@ -593,6 +594,10 @@ impl NirBlock for nir_block { let self_ptr = self as *const _ as *mut _; unsafe { nir_block_get_following_loop(self_ptr).as_ref() } } + + fn parent(&self) -> &nir_cf_node { + self.cf_node.parent().unwrap() + } } pub trait NirIf { @@ -623,6 +628,7 @@ impl NirIf for nir_if { pub trait NirLoop { fn iter_body(&self) -> ExecListIter; + fn first_block(&self) -> &nir_block; fn following_block(&self) -> &nir_block; } @@ -631,6 +637,10 @@ impl NirLoop for nir_loop { ExecListIter::new(&self.body, offset_of!(nir_cf_node, node)) } + fn first_block(&self) -> &nir_block { + self.iter_body().next().unwrap().as_block().unwrap() + } + fn following_block(&self) -> &nir_block { self.cf_node.next().unwrap().as_block().unwrap() } @@ -642,6 +652,7 @@ pub trait NirCfNode { fn as_loop(&self) -> Option<&nir_loop>; fn next(&self) -> Option<&nir_cf_node>; fn prev(&self) -> Option<&nir_cf_node>; + fn parent(&self) -> Option<&nir_cf_node>; } impl NirCfNode for nir_cf_node { @@ -680,6 +691,10 @@ impl NirCfNode for nir_cf_node { ExecListIter::at(&self.node, offset_of!(nir_cf_node, node), true); iter.next() } + + fn parent(&self) -> Option<&nir_cf_node> { + NonNull::new(self.parent).map(|b| unsafe { b.as_ref() }) + } } pub trait NirFunctionImpl {