Strength Reduction Using TXL

Software Transformation Systems
TXL solution to TIL Chairmarks #3.3, Strength reduction, recognize opportunities to reduce multiplication by an iterator to iterative addition.

Thie simple example demonstrates the basics of strength reduction optimizations using TXL. Strength reduction is normally a part of optimization for high performance numerical applications on modest processors such as ARM.

-- JamesCordy - 03 Jan 2008

File "TILstrengthred.Txl"

% Basic strength reduction in TIL programs using TXL
% Jim Cordy, January 2008

% Given a TIL program, look for opportunities to leverage loops to
% reduce multiplications to additions (strength reduction).

% This program could be combined with other optimization rules
% to form a comprehensive source optimizer.

% Begin with the TIL base grammar, using precedence
#define PRIORITY
include "TIL.Grm"

% Preserve comments in this transformation
#pragma -comment

redefine statement
    |   [comment] [NL]
end redefine

% Main function - just apply stages of the transformation

function main
    replace [program]
        P [program]
        P [strengthReduceMultiplications]
end function

% Strength reduction in for loops - recognize expresssions of the form
% "x+*i" in for loops iterating "i", and reduce to addition.

rule strengthReduceMultiplications
    % Find a for statement
    replace [repeat statement]
        'for I [id] := Low [expression] 'to High [expression] 'do
            InnerStatements [repeat statement]
        Rest [repeat statement]

    % That has an expression multiplied by the iterator 
    % (for simplicity we assume a simple variable reference in this example)
    deconstruct * [term] InnerStatements
        J [id] * I

    % Where the expression is not changed in the loop
    deconstruct not * [statement] InnerStatements
        J := _ [expression] ;
    deconstruct not * [statement] InnerStatements
        'for J := _ [expression] 'to _ [expression] 'do
            _ [repeat statement]

    % Construct a unique new variable name
    construct JI [id]
        J [_ I] [!]

    % And convert to additive form
        var JI;
        '// can be constant-folded later
        JI := ((Low)-1) * J; 
        'for I := Low 'to High 'do
            JI := JI + J;
            InnerStatements [replaceMultiply J I JI] 
end rule

rule replaceMultiply J [id] I [id] JI [id]
    replace [term]
        J * I
end rule

Example run: "strength.til" is the simple TIL multiplies example program that happens to have an embedded opportunity for strength reduction.

<linux> cat strength.til
// Test of strength reduction
for i := 1 to 9 do
    for j := 1 to 10 do
        write i*j;

<linux> txl strength.til TILstrengthred.Txl
TXL v10.5 (11.12.07) (c)1988-2007 Queen's University at Kingston
Compiling TILstrengthred.Txl ... 
Parsing strength.til ...
Transforming ...

// Test of strength reduction
for i := 1 to 9 do
    var i_j1;
    // can be constant-folded later
    i_j1 := ((1) - 1) * i;
    for j := 1 to 10 do
        i_j1 := i_j1 + i;
        write i_j1;


-- JamesCordy - 03 Jan 2008