nv50/ir: support different unordered_set implementations
If build with C++11 standard, use std::unordered_set. Otherwise if build on old Android version with stlport, use std::tr1::unordered_set with a wrapper class. Otherwise use std::tr1::unordered_set. Signed-off-by: Chih-Wei Huang <cwhuang@linux.org.tw> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
56ebd3314b
commit
2a4af36517
|
@ -29,8 +29,8 @@
|
|||
#include <deque>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <tr1/unordered_set>
|
||||
|
||||
#include "codegen/unordered_set.h"
|
||||
#include "codegen/nv50_ir_util.h"
|
||||
#include "codegen/nv50_ir_graph.h"
|
||||
|
||||
|
@ -585,10 +585,10 @@ public:
|
|||
|
||||
static inline Value *get(Iterator&);
|
||||
|
||||
std::tr1::unordered_set<ValueRef *> uses;
|
||||
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 unordered_set<ValueRef *>::iterator UseIterator;
|
||||
typedef unordered_set<ValueRef *>::const_iterator UseCIterator;
|
||||
typedef std::list<ValueDef *>::iterator DefIterator;
|
||||
typedef std::list<ValueDef *>::const_iterator DefCIterator;
|
||||
|
||||
|
|
|
@ -224,7 +224,7 @@ NVC0LegalizePostRA::findFirstUses(
|
|||
const Instruction *texi,
|
||||
const Instruction *insn,
|
||||
std::list<TexUse> &uses,
|
||||
std::tr1::unordered_set<const Instruction *>& visited)
|
||||
unordered_set<const Instruction *>& visited)
|
||||
{
|
||||
for (int d = 0; insn->defExists(d); ++d) {
|
||||
Value *v = insn->getDef(d);
|
||||
|
@ -323,7 +323,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;
|
||||
unordered_set<const Instruction *> visited;
|
||||
findFirstUses(texes[i], texes[i], uses[i], visited);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 *>&);
|
||||
unordered_set<const Instruction *>&);
|
||||
void findOverwritingDefs(const Instruction *tex, Instruction *insn,
|
||||
const BasicBlock *term,
|
||||
std::list<TexUse>&);
|
||||
|
|
|
@ -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;
|
||||
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 (unordered_set<Instruction *>::const_iterator it = to_del.begin();
|
||||
it != to_del.end(); ++it)
|
||||
delete_Instruction(func->getProgram(), *it);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
#ifndef __NV50_UNORDERED_SET_H__
|
||||
#define __NV50_UNORDERED_SET_H__
|
||||
|
||||
#if (__cplusplus >= 201103L) || defined(ANDROID)
|
||||
#include <unordered_set>
|
||||
#else
|
||||
#include <tr1/unordered_set>
|
||||
#endif
|
||||
|
||||
namespace nv50_ir {
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
using std::unordered_set;
|
||||
#elif !defined(ANDROID)
|
||||
using std::tr1::unordered_set;
|
||||
#else // Android release before lollipop
|
||||
using std::isfinite;
|
||||
typedef std::tr1::unordered_set<void *> voidptr_unordered_set;
|
||||
|
||||
template <typename V>
|
||||
class unordered_set : public voidptr_unordered_set {
|
||||
public:
|
||||
typedef voidptr_unordered_set _base;
|
||||
typedef _base::iterator _biterator;
|
||||
typedef _base::const_iterator const_biterator;
|
||||
|
||||
class iterator : public _biterator {
|
||||
public:
|
||||
iterator(const _biterator & i) : _biterator(i) {}
|
||||
V operator*() const { return reinterpret_cast<V>(*_biterator(*this)); }
|
||||
};
|
||||
class const_iterator : public const_biterator {
|
||||
public:
|
||||
const_iterator(const iterator & i) : const_biterator(i) {}
|
||||
const_iterator(const const_biterator & i) : const_biterator(i) {}
|
||||
const V operator*() const { return reinterpret_cast<const V>(*const_biterator(*this)); }
|
||||
};
|
||||
|
||||
iterator begin() { return _base::begin(); }
|
||||
iterator end() { return _base::end(); }
|
||||
const_iterator begin() const { return _base::begin(); }
|
||||
const_iterator end() const { return _base::end(); }
|
||||
};
|
||||
#endif
|
||||
|
||||
} // namespace nv50_ir
|
||||
|
||||
#endif // __NV50_UNORDERED_SET_H__
|
Loading…
Reference in New Issue