// slang-ir-sccp.h
#pragma once

namespace Slang
{
struct IRModule;
struct IRInst;
class DiagnosticSink;
class TargetProgram;

/// Apply Sparse Conditional Constant Propagation (SCCP) to a module.
///
/// This optimization replaces instructions that can only ever evaluate
/// to a single (well-defined) value with that constant value, and
/// also eliminates conditional branches where the condition will
/// always evaluate to a constant (which can lead to entire blocks
/// becoming dead code)
/// Returns true if IR is changed.
bool applySparseConditionalConstantPropagation(
    IRModule* module,
    TargetProgram* targetProgram,
    DiagnosticSink* sink);
bool applySparseConditionalConstantPropagationForGlobalScope(
    IRModule* module,
    TargetProgram* targetProgram,
    DiagnosticSink* sink);

bool applySparseConditionalConstantPropagation(
    IRInst* func,
    TargetProgram* targetProgram,
    DiagnosticSink* sink);

IRInst* tryConstantFoldInst(IRModule* module, TargetProgram* targetProgram, IRInst* inst);
} // namespace Slang
