[Mesa-dev] [PATCH v2 12/15] nv50/ir: optimize the use of std::tr1::unordered_set
Ilia Mirkin
imirkin at alum.mit.edu
Tue May 19 20:30:26 PDT 2015
Francisco, any opinion on this patch (as the resident C++ expert)? It
seems a little odd. I'd just as soon skip this, and just use "using
std::tr1::unordered_set" or "using std::unordered_set" as necessary in
the next patch. But perhaps this is a common technique?
On Tue, May 19, 2015 at 11:25 PM, Chih-Wei Huang
<cwhuang at android-x86.org> wrote:
> Instead of using unordered_set<user-defined-type *> directly, the patch
> changes to use unordered_set<void *> and adds a wrapper template class
> to convert the iterators to the expected user-defined type.
>
> This avoid instantiating the template multiple times and make the object
> code be smaller about 4KB.
>
> Signed-off-by: Chih-Wei Huang <cwhuang at linux.org.tw>
> ---
> src/gallium/drivers/nouveau/codegen/nv50_ir.h | 28 +++++++++++++++++++---
> .../nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 4 ++--
> .../nouveau/codegen/nv50_ir_lowering_nvc0.h | 4 +---
> src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp | 5 ++--
> 4 files changed, 30 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.h b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
> index 529dcb9..f4d52b7 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir.h
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
> @@ -451,6 +451,28 @@ struct Storage
> #define NV50_IR_INTERP_OFFSET (2 << 2)
> #define NV50_IR_INTERP_SAMPLEID (3 << 2)
>
> +typedef std::tr1::unordered_set<void *> voidptr_unordered_set;
> +
> +template <typename V>
> +class ptr_unordered_set : public voidptr_unordered_set {
> + public:
> + typedef voidptr_unordered_set _base;
> + typedef _base::iterator _biterator;
> +
> + class iterator : public _biterator {
> + public:
> + iterator(const _biterator & i) : _biterator(i) {}
> + V *operator*() { return reinterpret_cast<V *>(*_biterator(*this)); }
> + const V *operator*() const { return reinterpret_cast<const V *>(*_biterator(*this)); }
> + };
> + typedef const iterator const_iterator;
> +
> + iterator begin() { return _base::begin(); }
> + iterator end() { return _base::end(); }
> + const_iterator begin() const { return _base::begin(); }
> + const_iterator end() const { return _base::end(); }
> +};
> +
> // do we really want this to be a class ?
> class Modifier
> {
> @@ -583,10 +605,10 @@ public:
>
> static inline Value *get(Iterator&);
>
> - std::tr1::unordered_set<ValueRef *> uses;
> + ptr_unordered_set<ValueRef> uses;
> std::list<ValueDef *> defs;
> - typedef std::tr1::unordered_set<ValueRef *>::iterator UseIterator;
> - typedef std::tr1::unordered_set<ValueRef *>::const_iterator UseCIterator;
> + typedef ptr_unordered_set<ValueRef>::iterator UseIterator;
> + typedef ptr_unordered_set<ValueRef>::const_iterator UseCIterator;
> typedef std::list<ValueDef *>::iterator DefIterator;
> typedef std::list<ValueDef *>::const_iterator DefCIterator;
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> index b61f3c4..669d292 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> @@ -224,7 +224,7 @@ NVC0LegalizePostRA::findFirstUses(
> const Instruction *texi,
> const Instruction *insn,
> std::list<TexUse> &uses,
> - std::tr1::unordered_set<const Instruction *>& visited)
> + ptr_unordered_set<const Instruction>& visited)
> {
> for (int d = 0; insn->defExists(d); ++d) {
> Value *v = insn->getDef(d);
> @@ -318,7 +318,7 @@ NVC0LegalizePostRA::insertTextureBarriers(Function *fn)
> if (!uses)
> return false;
> for (size_t i = 0; i < texes.size(); ++i) {
> - std::tr1::unordered_set<const Instruction *> visited;
> + ptr_unordered_set<const Instruction> visited;
> findFirstUses(texes[i], texes[i], uses[i], visited);
> }
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
> index 260e101..17b6f6f 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
> @@ -20,8 +20,6 @@
> * OTHER DEALINGS IN THE SOFTWARE.
> */
>
> -#include <tr1/unordered_set>
> -
> #include "codegen/nv50_ir.h"
> #include "codegen/nv50_ir_build_util.h"
>
> @@ -73,7 +71,7 @@ private:
> inline bool insnDominatedBy(const Instruction *, const Instruction *) const;
> void findFirstUses(const Instruction *tex, const Instruction *def,
> std::list<TexUse>&,
> - std::tr1::unordered_set<const Instruction *>&);
> + ptr_unordered_set<const Instruction>&);
> void findOverwritingDefs(const Instruction *tex, Instruction *insn,
> const BasicBlock *term,
> std::list<TexUse>&);
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp
> index 898653c..03acba7 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp
> @@ -25,7 +25,6 @@
>
> #include <stack>
> #include <limits>
> -#include <tr1/unordered_set>
>
> namespace nv50_ir {
>
> @@ -1551,7 +1550,7 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
> // Keep track of which instructions to delete later. Deleting them
> // inside the loop is unsafe since a single instruction may have
> // multiple destinations that all need to be spilled (like OP_SPLIT).
> - std::tr1::unordered_set<Instruction *> to_del;
> + ptr_unordered_set<Instruction> to_del;
>
> for (Value::DefIterator d = lval->defs.begin(); d != lval->defs.end();
> ++d) {
> @@ -1593,7 +1592,7 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
> }
> }
>
> - for (std::tr1::unordered_set<Instruction *>::const_iterator it = to_del.begin();
> + for (ptr_unordered_set<Instruction>::iterator it = to_del.begin();
> it != to_del.end(); ++it)
> delete_Instruction(func->getProgram(), *it);
> }
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list