X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ir.cpp;h=c71cad8624e7e055d2a3b7e6203b9061b2656fbb;hp=76d9db3d57b15cf5dad83b494dfe21d9ee8286a3;hb=def1a26b12ffdec8f8e09fb9c41459ad30f573d3;hpb=ad1cfcfeaab754b3a7d34a152b0d334f7f040239 diff --git a/ir.cpp b/ir.cpp index 76d9db3..c71cad8 100644 --- a/ir.cpp +++ b/ir.cpp @@ -631,6 +631,37 @@ bool ir_function_finalize(ir_function *self) if (self->m_builtin) return true; + for (auto& lp : self->m_locals) { + ir_value *v = lp.get(); + if (v->m_reads.empty() && v->m_writes.size()) { + // if it's a vector check to ensure all it's members are unused before + // claiming it's unused, otherwise skip the vector entierly + if (v->m_vtype == TYPE_VECTOR) + { + size_t mask = (1 << 0) | (1 << 1) | (1 << 2), bits = 0; + for (size_t i = 0; i < 3; i++) + if (!v->m_members[i] || (v->m_members[i]->m_reads.empty() + && v->m_members[i]->m_writes.size())) + bits |= (1 << i); + // all components are unused so just report the vector + if (bits == mask && irwarning(v->m_context, WARN_UNUSED_VARIABLE, + "unused variable: `%s`", v->m_name.c_str())) + return false; + else if (bits != mask) + // individual components are unused so mention them + for (size_t i = 0; i < 3; i++) + if ((bits & (1 << i)) + && irwarning(v->m_context, WARN_UNUSED_COMPONENT, + "unused vector component: `%s.%c`", v->m_name.c_str(), "xyz"[i])) + return false; + } + // just a standard variable + else if (v->m_name[0] != '#' + && irwarning(v->m_context, WARN_UNUSED_VARIABLE, + "unused variable: `%s`", v->m_name.c_str())) return false; + } + } + if (OPTS_OPTIMIZATION(OPTIM_PEEPHOLE)) { if (!ir_function_pass_peephole(self)) { irerror(self->m_context, "generic optimization pass broke something in `%s`", self->m_name.c_str()); @@ -914,7 +945,7 @@ ir_value* ir_value::vectorMember(unsigned int member) m = new ir_value(move(name), m_store, TYPE_FIELD); if (!m) return nullptr; - m->m_fieldtype = TYPE_VECTOR; + m->m_fieldtype = TYPE_FLOAT; m->m_context = m_context; m_members[member] = m;