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