CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
221 lines
8.4 KiB
C++
221 lines
8.4 KiB
C++
/* ************************************************************************
|
|
* Copyright (C) 2025-2026 Advanced Micro Devices, Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*
|
|
* ************************************************************************ */
|
|
|
|
/**
|
|
* @file intrinsic-compiler.cpp
|
|
* @brief Intrinsic Compiler Tool
|
|
*
|
|
* This tool compiles intrinsic definitions from Intrinsics.intrinsic to optimized
|
|
* .st.bc bitcode files.
|
|
*
|
|
* Pipeline:
|
|
* 1. Parse Intrinsics.intrinsic (high-level IR syntax)
|
|
* 2. Convert to LogicalModule (high-level IR, with function inlining)
|
|
* 3. Run high-level IR peephole optimization
|
|
* 4. Convert back to pattern format
|
|
* 5. Serialize to intrinsics.st.bc
|
|
* 6. Verify round-trip conversion
|
|
*
|
|
* Usage:
|
|
* intrinsic-compiler [--verbose|-v] <input.intrinsic> <output.st.bc>
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
#include "stinkytofu/ir/logical/IntrinsicPatternConverter.hpp"
|
|
#include "stinkytofu/serialization/asm/PatternParser.hpp"
|
|
#include "stinkytofu/serialization/logical/IRSerializer.hpp"
|
|
#include "stinkytofu/transforms/logical/LogicalPeepholePass.hpp"
|
|
|
|
using namespace stinkytofu;
|
|
|
|
static void printUsage(const char* progName) {
|
|
std::cout << "StinkyTofu Intrinsic Compiler\n";
|
|
std::cout << "==============================\n\n";
|
|
std::cout << "Usage: " << progName << " [--verbose|-v] <input.intrinsic> <output.st.bc>\n\n";
|
|
std::cout << "Arguments:\n";
|
|
std::cout << " input.intrinsic Input intrinsic definition file (high-level IR)\n";
|
|
std::cout << " output.st.bc Output bitcode file\n\n";
|
|
std::cout << "Options:\n";
|
|
std::cout << " --verbose, -v Show detailed compilation progress\n\n";
|
|
std::cout << "Example:\n";
|
|
std::cout << " " << progName
|
|
<< " src/ir/logical/Intrinsics.intrinsic build/intrinsics.st.bc\n";
|
|
std::cout << " " << progName
|
|
<< " -v src/ir/logical/Intrinsics.intrinsic build/intrinsics.st.bc\n";
|
|
}
|
|
|
|
int main(int argc, char** argv) {
|
|
bool verbose = false;
|
|
std::string inputFile;
|
|
std::string outputFile;
|
|
|
|
// Parse arguments
|
|
int argIdx = 1;
|
|
while (argIdx < argc) {
|
|
std::string arg = argv[argIdx];
|
|
if (arg == "--verbose" || arg == "-v") {
|
|
verbose = true;
|
|
argIdx++;
|
|
} else if (inputFile.empty()) {
|
|
inputFile = arg;
|
|
argIdx++;
|
|
} else if (outputFile.empty()) {
|
|
outputFile = arg;
|
|
argIdx++;
|
|
} else {
|
|
std::cerr << "Error: Unexpected argument: " << arg << "\n\n";
|
|
printUsage(argv[0]);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if (inputFile.empty() || outputFile.empty()) {
|
|
printUsage(argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
if (verbose) {
|
|
std::cout << "=== StinkyTofu Intrinsic Compiler ===\n";
|
|
std::cout << "Input: " << inputFile << "\n";
|
|
std::cout << "Output: " << outputFile << "\n\n";
|
|
}
|
|
|
|
// Step 1: Parse intrinsic definitions
|
|
if (verbose) std::cout << "Step 1: Parsing intrinsic definitions...\n";
|
|
auto patterns = parsePatternFile(inputFile);
|
|
if (patterns.empty()) {
|
|
std::cerr << "Error: No patterns found in " << inputFile << "\n";
|
|
return 1;
|
|
}
|
|
|
|
// Filter intrinsic patterns only
|
|
std::vector<Pattern> intrinsics;
|
|
for (const auto& pattern : patterns) {
|
|
if (pattern.type == PatternType::Intrinsic) {
|
|
intrinsics.push_back(pattern);
|
|
}
|
|
}
|
|
|
|
if (verbose) std::cout << " Found " << intrinsics.size() << " intrinsic(s)\n\n";
|
|
|
|
if (intrinsics.empty()) {
|
|
std::cerr << "Error: No intrinsic patterns found in " << inputFile << "\n";
|
|
return 1;
|
|
}
|
|
|
|
// Step 2: Convert Text -> IR (with function inlining)
|
|
if (verbose)
|
|
std::cout << "Step 2: Converting text patterns to IR (inlining function calls)...\n";
|
|
auto irModules = IntrinsicPatternConverter::patternsToIR(intrinsics);
|
|
if (verbose) std::cout << " Converted " << irModules.size() << " intrinsic(s) to IR\n\n";
|
|
|
|
if (verbose) {
|
|
for (const auto& irModule : irModules) {
|
|
std::cout << " " << irModule.name << ":\n";
|
|
std::cout << " Arguments: " << irModule.arguments.size() << "\n";
|
|
std::cout << " IR Instructions: " << irModule.instructions.size() << "\n";
|
|
|
|
// Display IR instructions
|
|
std::cout << " IR:\n";
|
|
for (const auto& irInst : irModule.instructions) {
|
|
std::cout << " ";
|
|
irInst->dump(std::cout);
|
|
std::cout << "\n";
|
|
}
|
|
}
|
|
std::cout << "\n";
|
|
}
|
|
|
|
// Step 3: High-Level IR Optimization
|
|
if (verbose) std::cout << "Step 3: Running high-level IR peephole optimization...\n";
|
|
|
|
// TODO: Update to use new Pass infrastructure with LogicalToFunctionConverter
|
|
// For now, skip optimization to avoid API mismatch
|
|
if (verbose) {
|
|
std::cout << " Optimization pass temporarily disabled during refactoring\n";
|
|
std::cout << "\n";
|
|
}
|
|
|
|
// Step 4: Convert IR -> Text (for serialization)
|
|
if (verbose) std::cout << "Step 4: Converting IR back to text patterns...\n";
|
|
auto optimizedPatterns = IntrinsicPatternConverter::irToPatterns(irModules);
|
|
if (verbose)
|
|
std::cout << " Converted " << optimizedPatterns.size() << " IR module(s) to patterns\n\n";
|
|
|
|
// Step 5: Serialize to .st.bc
|
|
if (verbose) std::cout << "Step 5: Serializing to " << outputFile << "...\n";
|
|
if (!IRSerializer::serializeToFile(optimizedPatterns, outputFile)) {
|
|
std::cerr << "Error: Failed to write " << outputFile << "\n";
|
|
return 1;
|
|
}
|
|
|
|
if (verbose)
|
|
std::cout << " Success! Wrote " << optimizedPatterns.size() << " intrinsic(s) to "
|
|
<< outputFile << "\n\n";
|
|
|
|
// Step 6: Verify round-trip conversion
|
|
if (verbose) std::cout << "Step 6: Verifying round-trip conversion...\n";
|
|
auto loaded = IRSerializer::deserializeFromFile(outputFile);
|
|
if (loaded.size() != optimizedPatterns.size()) {
|
|
std::cerr << "Warning: Verification failed. Loaded " << loaded.size()
|
|
<< " intrinsics, expected " << optimizedPatterns.size() << "\n";
|
|
return 1;
|
|
}
|
|
|
|
// Verify each intrinsic
|
|
for (size_t i = 0; i < loaded.size(); ++i) {
|
|
const auto& original = optimizedPatterns[i];
|
|
const auto& reloaded = loaded[i];
|
|
|
|
if (original.name != reloaded.name) {
|
|
std::cerr << "Warning: Name mismatch for intrinsic " << i << ": " << original.name
|
|
<< " vs " << reloaded.name << "\n";
|
|
return 1;
|
|
}
|
|
|
|
if (original.body.size() != reloaded.body.size()) {
|
|
std::cerr << "Warning: Instruction count mismatch for " << original.name << ": "
|
|
<< original.body.size() << " vs " << reloaded.body.size() << "\n";
|
|
return 1;
|
|
}
|
|
|
|
if (verbose)
|
|
std::cout << " - " << original.name
|
|
<< " verified (Text -> IR -> Text -> .st.bc -> Text)\n";
|
|
}
|
|
|
|
if (verbose) {
|
|
std::cout << "\n Round-trip conversion successful!\n";
|
|
std::cout << " Pipeline: Text -> IR -> Text -> .st.bc -> Text verified!\n\n";
|
|
std::cout << "=== Compilation Complete ===\n";
|
|
} else {
|
|
// Quiet mode: just show summary
|
|
std::cout << "Compiled " << optimizedPatterns.size() << " intrinsic(s) to " << outputFile
|
|
<< "\n";
|
|
}
|
|
|
|
return 0;
|
|
}
|