def test_write_after_read_with_offset():
    testee = VerticalLoopSectionFactory(
        horizontal_executions=[
            HorizontalExecutionFactory(
                body=[AssignStmtFactory(right__name="foo", right__offset__i=1)]
            ),
            HorizontalExecutionFactory(body=[AssignStmtFactory(left__name="foo")]),
        ]
    )
    transformed = GreedyMerging().visit(testee)
    assert transformed == testee
Example #2
0
 def _optimize_oir(self, oir):
     oir = GreedyMerging().visit(oir)
     oir = AdjacentLoopMerging().visit(oir)
     oir = LocalTemporariesToScalars().visit(oir)
     oir = WriteBeforeReadTemporariesToScalars().visit(oir)
     oir = OnTheFlyMerging().visit(oir)
     oir = NoFieldAccessPruning().visit(oir)
     oir = IJCacheDetection().visit(oir)
     oir = KCacheDetection().visit(oir)
     oir = PruneKCacheFills().visit(oir)
     oir = PruneKCacheFlushes().visit(oir)
     return oir
def test_nonzero_extent_merging():
    testee = VerticalLoopSectionFactory(
        horizontal_executions=[
            HorizontalExecutionFactory(body=[AssignStmtFactory(right__name="foo")]),
            HorizontalExecutionFactory(
                body=[AssignStmtFactory(right__name="foo", right__offset__j=1)]
            ),
        ]
    )
    transformed = GreedyMerging().visit(testee)
    assert len(transformed.horizontal_executions) == 1
    assert transformed.horizontal_executions[0].body == sum(
        (he.body for he in testee.horizontal_executions), []
    )
def test_mixed_merging():
    testee = VerticalLoopSectionFactory(
        horizontal_executions=[
            HorizontalExecutionFactory(body=[AssignStmtFactory(left__name="foo")]),
            HorizontalExecutionFactory(
                body=[AssignStmtFactory(left__name="bar", right__name="foo", right__offset__i=1)]
            ),
            HorizontalExecutionFactory(body=[AssignStmtFactory(right__name="bar")]),
        ]
    )
    transformed = GreedyMerging().visit(testee)
    assert len(transformed.horizontal_executions) == 2
    assert transformed.horizontal_executions[0].body == testee.horizontal_executions[0].body
    assert transformed.horizontal_executions[1].body == sum(
        (he.body for he in testee.horizontal_executions[1:]), []
    )
Example #5
0
# SPDX-License-Identifier: GPL-3.0-or-later

import pytest

from gtc.passes.oir_optimizations.horizontal_execution_merging import GreedyMerging

from ...oir_utils import (
    AssignStmtBuilder,
    CartesianOffsetBuilder,
    FieldAccessBuilder,
    HorizontalExecutionBuilder,
    VerticalLoopSectionBuilder,
)


@pytest.fixture(params=[GreedyMerging()])
def merger(request):
    return request.param


def test_zero_extent_merging(merger):
    testee = (
        VerticalLoopSectionBuilder()
        .add_horizontal_execution(
            HorizontalExecutionBuilder().add_stmt(AssignStmtBuilder("foo", "bar").build()).build()
        )
        .add_horizontal_execution(
            HorizontalExecutionBuilder().add_stmt(AssignStmtBuilder("baz", "bar").build()).build()
        )
        .add_horizontal_execution(
            HorizontalExecutionBuilder().add_stmt(AssignStmtBuilder("foo", "foo").build()).build()
Example #6
0
 def _optimize_oir(self, oir):
     oir = GreedyMerging().visit(oir)
     oir = TemporariesToScalars().visit(oir)
     return oir