/* Copyright The GNU Toolchain Authors This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ #ifndef GCC_HIERARCHICAL_DISCRIMINATOR_H #define GCC_HIERARCHICAL_DISCRIMINATOR_H #include "config.h" #include "system.h" #include "coretypes.h" #include "gimple.h" #include "tree.h" #include "basic-block.h" #include "input.h" /* Hierarchical discriminator layout (32 bits total): Discriminator format: [Base:8][Multiplicity:7][CopyID:11][Unused:6] - Base: bits 0-7 (8 bits, 0-255) - Multiplicity: bits 8-14 (7 bits, 0-127) - CopyID: bits 15-25 (11 bits, 0-2047) - Unused: bits 26-31 (6 bits, reserved) Base discriminator: Used by front-end and early passes to distinguish different statements on the same source line. Multiplicity: Represents when a single IR statement corresponds to multiple scalar iterations or executions CopyID: Unique identifier for distinct code copies to distinguish */ /* Helper function to assign discriminators to a statement. This preserves the base discriminator and updates multiplicity and/or copyid. */ extern void assign_discriminators_to_stmt (gimple* stmt, unsigned int multiplicity_factor, unsigned int copyid); /* Helper function to assign discriminators to all statements in a basic block. This preserves the base discriminator and updates multiplicity and/or copyid. PHI statements, PHI arguments, and edge locations are also updated. */ extern void assign_discriminators_to_bb (basic_block bb, unsigned int multiplicity_factor, unsigned int copyid); /* Helper function to assign discriminators to all basic blocks in a loop. This is used by loop versioning passes to distinguish different versions of the same loop and to indicate vectorization factors. */ extern void assign_discriminators_to_loop (class loop *loop, unsigned int multiplicity_factor, unsigned int copyid); /* Copy ID allocator for tracking unique copy_id assignments per location. This ensures that nested code duplication (e.g., unroll + vectorize) gets unique copy_ids even when the same location is duplicated multiple times. */ struct copyid_allocator { /* Hash map from location to the next available copy_id base. Key: location_t, Value: unsigned int (next available base). */ hash_map, unsigned int> *location_map; /* Whether the allocator has been initialized. */ bool initialized; }; /* Allocate a unique copy_id base for the given location. STRIDE indicates how many copy_ids to reserve (for unrolling N times, use stride=N). Returns the base copy_id. */ extern unsigned int allocate_copyid_base (location_t loc, unsigned int stride); /* Free the copy_id allocator for a function. */ extern void free_copyid_allocator (struct function *fn); #endif /* GCC_HIERARCHICAL_DISCRIMINATOR_H. */