1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Copyright © 2014 Connor Abbott 3bf215546Sopenharmony_ci * 4bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 5bf215546Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 6bf215546Sopenharmony_ci * to deal in the Software without restriction, including without limitation 7bf215546Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8bf215546Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 9bf215546Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 10bf215546Sopenharmony_ci * 11bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the next 12bf215546Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the 13bf215546Sopenharmony_ci * Software. 14bf215546Sopenharmony_ci * 15bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16bf215546Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18bf215546Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19bf215546Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20bf215546Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21bf215546Sopenharmony_ci * IN THE SOFTWARE. 22bf215546Sopenharmony_ci */ 23bf215546Sopenharmony_ci 24bf215546Sopenharmony_ci#ifndef NIR_INSTR_SET_H 25bf215546Sopenharmony_ci#define NIR_INSTR_SET_H 26bf215546Sopenharmony_ci 27bf215546Sopenharmony_ci#include "nir.h" 28bf215546Sopenharmony_ci 29bf215546Sopenharmony_ci/** 30bf215546Sopenharmony_ci * This file defines functions for creating, destroying, and manipulating an 31bf215546Sopenharmony_ci * "instruction set," which is an abstraction for finding duplicate 32bf215546Sopenharmony_ci * instructions using a hash set. Note that the question of whether an 33bf215546Sopenharmony_ci * instruction is actually a duplicate (e.g. whether it has any side effects) 34bf215546Sopenharmony_ci * is handled transparently. The user can pass any instruction to 35bf215546Sopenharmony_ci * nir_instr_set_add_or_rewrite() and nir_instr_set_remove(), and if the 36bf215546Sopenharmony_ci * instruction isn't safe to rewrite or isn't supported, it's silently 37bf215546Sopenharmony_ci * removed. 38bf215546Sopenharmony_ci */ 39bf215546Sopenharmony_ci 40bf215546Sopenharmony_ci/*@{*/ 41bf215546Sopenharmony_ci 42bf215546Sopenharmony_ci/** Creates an instruction set, using a given ralloc mem_ctx */ 43bf215546Sopenharmony_cistruct set *nir_instr_set_create(void *mem_ctx); 44bf215546Sopenharmony_ci 45bf215546Sopenharmony_ci/** Destroys an instruction set. */ 46bf215546Sopenharmony_civoid nir_instr_set_destroy(struct set *instr_set); 47bf215546Sopenharmony_ci 48bf215546Sopenharmony_ci/** 49bf215546Sopenharmony_ci * Adds an instruction to an instruction set if it doesn't exist. If it 50bf215546Sopenharmony_ci * does already exist, rewrites all uses of it to point to the other 51bf215546Sopenharmony_ci * already-inserted instruction. Returns 'true' if the uses of the instruction 52bf215546Sopenharmony_ci * were rewritten. Otherwise, replaces the already-inserted instruction 53bf215546Sopenharmony_ci * with the new one. 54bf215546Sopenharmony_ci * 55bf215546Sopenharmony_ci * If cond_function() is given, only rewrites uses if 56bf215546Sopenharmony_ci * cond_function(old_instr, new_instr) returns true. 57bf215546Sopenharmony_ci */ 58bf215546Sopenharmony_cibool nir_instr_set_add_or_rewrite(struct set *instr_set, nir_instr *instr, 59bf215546Sopenharmony_ci bool (*cond_function)(const nir_instr *a, 60bf215546Sopenharmony_ci const nir_instr *b)); 61bf215546Sopenharmony_ci 62bf215546Sopenharmony_ci/** 63bf215546Sopenharmony_ci * Removes an instruction from an instruction set, so that other instructions 64bf215546Sopenharmony_ci * won't be merged with it. 65bf215546Sopenharmony_ci */ 66bf215546Sopenharmony_civoid nir_instr_set_remove(struct set *instr_set, nir_instr *instr); 67bf215546Sopenharmony_ci 68bf215546Sopenharmony_ci/*@}*/ 69bf215546Sopenharmony_ci 70bf215546Sopenharmony_ci#endif /* NIR_INSTR_SET_H */ 71