docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
sdfg::transformations::LoopConditionNormalize Class Reference

Loop condition normalization to convert inequality conditions to relational comparisons. More...

#include <sdfg/transformations/loop_condition_normalize.h>

Inheritance diagram for sdfg::transformations::LoopConditionNormalize:
[legend]

Public Member Functions

 LoopConditionNormalize (structured_control_flow::StructuredLoop &loop)
 Construct a LoopConditionNormalize transformation.
virtual std::string name () const override
 Get the name of this transformation.
virtual bool can_be_applied (builder::StructuredSDFGBuilder &builder, analysis::AnalysisManager &analysis_manager) override
 Check if this transformation can be safely applied.
virtual void apply (builder::StructuredSDFGBuilder &builder, analysis::AnalysisManager &analysis_manager) override
 Apply this transformation to the SDFG.
virtual void to_json (nlohmann::json &j) const override
 Serialize this transformation to JSON.
Public Member Functions inherited from sdfg::transformations::Transformation
virtual ~Transformation ()=default
virtual void set_report (PassReportConsumer *report)
 Set the report consumer for transformation feedback.
virtual bool try_apply (builder::StructuredSDFGBuilder &builder, analysis::AnalysisManager &analysis_manager)
 Attempt to apply the transformation if possible.

Static Public Member Functions

static LoopConditionNormalize from_json (builder::StructuredSDFGBuilder &builder, const nlohmann::json &j)

Additional Inherited Members

Protected Attributes inherited from sdfg::transformations::Transformation
PassReportConsumer * report_ = nullptr

Detailed Description

Loop condition normalization to convert inequality conditions to relational comparisons.

This transformation converts loop conditions with != (Unequality) or == (Equality) to relational comparisons (< or >) based on the loop's stride direction.

Precondition: stride is ±1 (apply LoopUnitStride first if needed)

For positive stride (+1): i != N → i < N (loop runs while i < N, exits when reaching N)

For negative stride (-1): i != N → i > N (loop runs while i > N, exits when reaching N)

Example (LLVM-style loop with != condition): // Original: for (i = 0; i != 10; i++) for (i = 0; i != 10; i += 1) body(i)

// After normalization: for (i = 0; i < 10; i += 1) body(i)

The transformation handles affine expressions in the condition: i != 2*N + 1 → i < 2*N + 1 (for stride = +1)

Prerequisites:

  • Loop must have unit stride (|stride| == 1)
  • Condition must contain at least one Unequality with the induction variable
  • The inequality must be normalizable to form: indvar != bound

Non-applicability:

  • Stride is not ±1
  • Condition has no Unequality/Equality literals
  • indvar appears on both sides of the condition
  • Condition is not affine in indvar
Note
This transformation is typically applied after LoopUnitStride and before LoopRotate in the loop normalization pipeline.
See also
LoopShift
LoopUnitStride
LoopRotate

Constructor & Destructor Documentation

◆ LoopConditionNormalize()

sdfg::transformations::LoopConditionNormalize::LoopConditionNormalize ( structured_control_flow::StructuredLoop & loop)
explicit

Construct a LoopConditionNormalize transformation.

Parameters
loopThe loop to normalize (must have unit stride)

Member Function Documentation

◆ apply()

virtual void sdfg::transformations::LoopConditionNormalize::apply ( builder::StructuredSDFGBuilder & builder,
analysis::AnalysisManager & analysis_manager )
overridevirtual

Apply this transformation to the SDFG.

Parameters
builderThe SDFG builder
analysis_managerThe analysis manager (may be invalidated)

Implements sdfg::transformations::Transformation.

◆ can_be_applied()

virtual bool sdfg::transformations::LoopConditionNormalize::can_be_applied ( builder::StructuredSDFGBuilder & builder,
analysis::AnalysisManager & analysis_manager )
overridevirtual

Check if this transformation can be safely applied.

Parameters
builderThe SDFG builder
analysis_managerThe analysis manager providing necessary analyses
Returns
true if all preconditions are met

Implements sdfg::transformations::Transformation.

◆ from_json()

LoopConditionNormalize sdfg::transformations::LoopConditionNormalize::from_json ( builder::StructuredSDFGBuilder & builder,
const nlohmann::json & j )
static

◆ name()

virtual std::string sdfg::transformations::LoopConditionNormalize::name ( ) const
overridevirtual

Get the name of this transformation.

Returns
The transformation name (e.g., "LoopInterchange")

Implements sdfg::transformations::Transformation.

◆ to_json()

virtual void sdfg::transformations::LoopConditionNormalize::to_json ( nlohmann::json & j) const
overridevirtual

Serialize this transformation to JSON.

Parameters
jJSON object to populate with transformation description
Exceptions
std::logic_errorif not implemented

Implements sdfg::transformations::Transformation.


The documentation for this class was generated from the following file: