18f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt/*
28f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * Copyright © 2010 Intel Corporation
38f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt *
48f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
58f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * copy of this software and associated documentation files (the "Software"),
68f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * to deal in the Software without restriction, including without limitation
78f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense,
88f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * and/or sell copies of the Software, and to permit persons to whom the
98f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * Software is furnished to do so, subject to the following conditions:
108f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt *
118f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * The above copyright notice and this permission notice (including the next
128f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * paragraph) shall be included in all copies or substantial portions of the
138f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * Software.
148f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt *
158f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
168f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
178f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
188f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
198f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
208f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
218f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * DEALINGS IN THE SOFTWARE.
228f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt */
238f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
248f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt/**
25df883eb1575a740bf91e01cbe2eaa4dbc1f9f154Chad Versace * \file opt_noop_swizzle.cpp
268f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt *
278f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * If a swizzle doesn't change the order or count of components, then
288f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * remove the swizzle so that other optimization passes see the value
298f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt * behind it.
308f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt */
318f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
328f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt#include "ir.h"
338f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt#include "ir_visitor.h"
348f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt#include "ir_rvalue_visitor.h"
358f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt#include "ir_print_visitor.h"
368f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt#include "glsl_types.h"
378f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
38337d9c955b070224f7278524af54ddacd8bb0f17Eric Anholtnamespace {
39337d9c955b070224f7278524af54ddacd8bb0f17Eric Anholt
408f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholtclass ir_noop_swizzle_visitor : public ir_rvalue_visitor {
418f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholtpublic:
428f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   ir_noop_swizzle_visitor()
438f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   {
448f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt      this->progress = false;
458f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   }
468f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
478f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   void handle_rvalue(ir_rvalue **rvalue);
488f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   bool progress;
498f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt};
508f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
51337d9c955b070224f7278524af54ddacd8bb0f17Eric Anholt} /* unnamed namespace */
52337d9c955b070224f7278524af54ddacd8bb0f17Eric Anholt
538f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholtvoid
548f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholtir_noop_swizzle_visitor::handle_rvalue(ir_rvalue **rvalue)
558f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt{
568f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   if (!*rvalue)
578f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt      return;
588f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
598f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   ir_swizzle *swiz = (*rvalue)->as_swizzle();
608f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   if (!swiz || swiz->type != swiz->val->type)
618f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt      return;
628f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
638f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   int elems = swiz->val->type->vector_elements;
648f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   if (swiz->mask.x != 0)
658f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt      return;
668f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   if (elems >= 2 && swiz->mask.y != 1)
678f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt      return;
683ffab367685c0e0c7ce4d01a3b9b934cb0b15883Eric Anholt   if (elems >= 3 && swiz->mask.z != 2)
698f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt      return;
703ffab367685c0e0c7ce4d01a3b9b934cb0b15883Eric Anholt   if (elems >= 4 && swiz->mask.w != 3)
718f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt      return;
728f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
738f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   this->progress = true;
748f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   *rvalue = swiz->val;
758f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt}
768f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
778f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholtbool
788f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholtdo_noop_swizzle(exec_list *instructions)
798f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt{
808f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   ir_noop_swizzle_visitor v;
818f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   visit_list_elements(&v, instructions);
828f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt
838f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   return v.progress;
848f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt}
85