coins.casttohir
Class ToHirCOpt

java.lang.Object
  extended bycoins.casttohir.ToHirVisit
      extended bycoins.casttohir.ToHirCOpt
Direct Known Subclasses:
ToHirCOpt2

public class ToHirCOpt
extends ToHirVisit

Do simple optimizations (optimizations of expressions and conditions) for HIR-C. The level of optimizations can be specified by compiler option. ToHirCOpt does the optimizations of kind 1 throgh 3 as default optimizations.

 Expression optimization

 Kind 1. Non-volatile const-variable with initial value
   is changed to constant.
   ( At present, this transformation is bypassed
     because C parser ignores const qualifier.)

 Kind 2. Optimize pointer expressions
   Convert pointer arithmetic expression to array subscript expression.
   This conversion makes easy to find candidate arrays of parallelization
   without doing pointer analysis.
   a. (DECAY(array)+i+j)  -->  array[i+j]
   b. (pointer+i+j)       -->  UNDECAY(pointer)[i+j]

   However, it is limited that b. is done when the following conditions are
   satisfied. The pointer which satisfies these conditions is
   "Array parameter to which the content is not changed."
   . The value is not substituted.
   . The value is not acquired (is not copied).
   . The address is not operated. (ptr+int ptr-int)
   . The address is not taken. (&ptr)
   . The number of elements is not 0. (The pointer type maintains the number
       of elements when declared as an array parameter of C language.
       'Pointer type with range information' )

 Kind 3. Eliminate mutually opposing operations
   *&v    -->  v
   &*v    -->  v
   ~~v    -->  v
   -(-v)  -->  v
   DECAY(UNDECAY(pointer))  -->  pointer
   UNDECAY(DECAY(array))    -->  array

 Kind 4. Do optimization for special constants
   Special constants:
   . 0
   . 1
   . ALL_BITS_ARE_1: constant having 1 on all bit positions
       and having precesion greater or equal than that of
       at least one operand.
   . MORE_THAN_SIZE: constant having bit size greater than
       that of resultant expression.

     v +  0  -->  v
     v -  0  -->  v
     v -  v  -->  0 (v is non volatile integer or pointer)
     v *  0  -->  0
     v /  0  -->  issue warning
     v /  1  -->  v
     v %  0  -->  issue warning
     v %  1  -->  0
     v &  0  -->  0
     v &  ALL_BITS_ARE_1  -->  v
     v |  0               -->  v
     v |  ALL_BITS_ARE_1  -->  ALL_BITS_ARE_1
     v << 0               -->  v
     v << MORE_THAN_SIZE  -->  0
     v >> 0               -->  v
     v >> MORE_THAN_SIZE  -->  0 (v is unsigned integer)
     v >>>MORE_THAN_SIZE  -->  0

     [ 0 -  v  -->  -v (not supported) ]

 Condition optimization

 Kind 5. Do inversion of comparison
     !(a<b)  -->  a>=b
     (>, <=, >=, ==, != are transformed in the similar way)
   Before reaching to here, logical-not has been already converted to equality
   expression and comparison has been converted to conditional expression
   in ToHirC2. So, in actual coding, they are transformed in the following
   way:
    (a<b ? CONST_X : CONST_Y)==CONST_X  -->  a<b
    (a<b ? CONST_X : CONST_Y)==CONST_Y  -->  a>=b (inversion of comparison)
    (a<b ? CONST_X : CONST_Y)!=CONST_Y  -->  a<b
    (a<b ? CONST_X : CONST_Y)!=CONST_X  -->  a>=b (inversion of comparison)
  (>, <=, >=, ==, != are transformed in the similar way)

 6. Convert comparison that leads to always true or always false
   to constant issuing warning
     constant-a comparison-operator constant-b  --> true or false
     variable >  maximal value  --> false
     variable <  minimum value  --> false
     variable >= minimum value  --> true
     variable <= maximum value  --> true
   Following transformations are applied not only ADDR but also DECAY:
     (ADDR object-x) == (ADDR object-x)  --> true
     (ADDR object-x) == (ADDR object-y)  --> false
     (ADDR object-x) == 0                --> false
     (ADDR object-x) != (ADDR object-x)  --> false
     (ADDR object-x) != (ADDR object-y)  --> true
     (ADDR object-x) != 0                --> true

 7. If left operand of && or || is true or false, then
   change it to (side effect expression of left operand)
   followed with comma and (right operand or trure or false)
    e1 && e2
      false && e2  -->  (side effect of e1),false
      true  && e2  -->  (side effect of e1),e2
    e1 || e2
      false || e2  -->  (side effect of e1),e2
      true  || e2  -->  (side effect of e1),true
 8. If conditional expression part c of select expression is always
   true or false, then change it to (side effect of c) followed by
   comma and (2nd or 3rd operand)
      e1 ? e2 : e3  --> (side effect of e1), e2 when e1 is always true
      e1 ? e2 : e3  --> (side effect of e1), e3 when e1 is always false
      r = (a=1)>0 ? 1 : 0;  -->  r = (a=1) , 1;

 Note
   Side effects are placed at the point immediately preceeding the
   side effect completion point and combined with rest of given expression
   by using comma operator. Foe example,
   . if( f()*0 != 0 ) --> if( f(),false )
   . a += f()*0; --> f(),a+=0; --> f();
 Note
   Side effect completion point (sequence point)
   . after evaluation of an actual parameter
   . logical-and expression &&
   . logical-or  expression ||
   . selection   expression ?:
   . comma       expression ,
   . initiation  expression
   . expression statement (ExpStmt)
   . conditional expression part of if/switch/while/do-while
   . three parts s1, e2, s3 of for-statement for(s1; e2; s3)
   . optional return value expression of return statement
 


Field Summary
protected  SideEffectBuffer buffer
           
 int fDbgLevel
           
protected  HIR hir
           
protected  ConditionInverter inverter
           
protected  BlockStmt nowBlock
          Now processing block (used to create initializer).
protected  Sym sym
           
protected  ToHirCast toCast
           
protected  ToHir toHir
           
 
Constructor Summary
ToHirCOpt(ToHir tohir)
          Constructor.
 
Method Summary
protected  Exp atAdd(Exp e)
          At add expression node.
protected  Exp atAddAssign(Exp e)
          At add-assign expression node.
protected  Exp atAddr(Exp e)
          At address expression node.
protected  Exp atAnd(Exp e)
          At and expression node.
protected  Exp atAndAssign(Exp e)
          At and-assign expression node.
protected  Exp atArrow(Exp e)
          At arrow expression node.
protected  Exp atARShift(Exp e)
          At arithmetic R-shift expression node.
protected  Exp atAssign(Exp e)
          At assign expression node.
protected  void atAssignStmt(AssignStmt s)
          At assign statement node.
protected  void atBlock(BlockStmt s)
          At block statement node.
protected  Exp atCall(FunctionExp e)
          At function call expression node.
protected  Exp atCmpEq(Exp e)
          At EQ expression node.
protected  Exp atCmpGe(Exp e)
          At GE expression node.
protected  Exp atCmpGt(Exp e)
          At GT expression node.
protected  Exp atCmpLe(Exp e)
          At LE expression node.
protected  Exp atCmpLt(Exp e)
          At LT expression node.
protected  Exp atCmpNe(Exp e)
          At NE expression node.
protected  Exp atComma(Exp e)
          At comma expression node.
protected  Exp atConst(ConstNode e)
          At constant node.
protected  Exp atContents(Exp e)
          At indirection expression node.
protected  Exp atConv(Exp e)
          At cast expression node.
protected  Exp atDecay(Exp e)
          At decay expression node.
protected  Exp atDiv(Exp e)
          At div expression node.
protected  Exp atDivAssign(Exp e)
          At div-assign expression node.
protected  Exp atElem(ElemNode e)
          At element node.
protected  Exp atEqZero(Exp e)
          At logical-not expression node.
protected  Exp atExpList(ExpListExp e)
          At expression list node.
protected  Exp atExpRepeat(Exp e)
          At expression repeatation node.
protected  void atExpStmt(ExpStmt s)
          At expression statement node.
protected  void atFor(LoopStmt s)
          At for statement node.
protected  void atIf(IfStmt s)
          At if statement node.
protected  Exp atIndex(Exp e)
          At index expression node.
protected  InfStmt atInfStmt(InfStmt pInf)
          atInfStmt parses the pragma body in the form of String and change its symbols to instances of Sym (Var, Subp, Label, Const) and items enclosed in parenthesis to IrList changing its elements to Sym, etc.
protected  void atJump(JumpStmt s)
          At goto statement node.
protected  void atLabeledStmt(LabeledStmt s)
          At labeled statement node.
protected  Exp atLgAnd(Exp e)
          At logical-and expression node.
protected  Exp atLgOr(Exp e)
          At logical-or expression node.
protected  Exp atLShift(Exp e)
          At L-shift expression node.
protected  Exp atLShiftAssign(Exp e)
          At L-shift-assign expression node.
protected  Exp atMod(Exp e)
          At mod expression node.
protected  Exp atModAssign(Exp e)
          At mod-assign expression node.
protected  Exp atMul(Exp e)
          At mul expression node.
protected  Exp atMulAssign(Exp e)
          At mul-assign expression node.
protected  Exp atNeg(Exp e)
          At negative expression node.
protected  Exp atNot(Exp e)
          At not expression node.
protected  Exp atOffset(Exp e)
          At offset(difference of address) expression node.
protected  Exp atOr(Exp e)
          At or expression node.
protected  Exp atOrAssign(Exp e)
          At or-assign expression node.
protected  Exp atPost(int op, Exp e)
          At post-operator expression node.
protected  Exp atPre(int op, Exp e)
          At pre-operator expression node.
protected  Exp atQual(Exp e)
          At member-access expression node.
protected  void atReturn(ReturnStmt s)
          At return statement node.
protected  Exp atRShift(Exp e)
          At logical R-shift expression node.
protected  Exp atRShiftAssign(Exp e)
          At R-shift-assign expression node.
protected  Exp atSelect(Exp e)
          At selection expression node.
protected  void atSetDataStmt(SetDataStmt s)
          At datacode statement node.
protected  Exp atSub(Exp e)
          At sub expression node.
protected  Exp atSubAssign(Exp e)
          At sub-assign expression node.
protected  Exp atSubp(SubpNode e)
          At function node.
protected  SubpDefinition atSubpDefinition(SubpDefinition s)
          At block statement node.
protected  Exp atSubs(Exp e)
          At subscript expression node.
protected  void atSwitch(SwitchStmt s)
          At switch statement node.
protected  Exp atUndecay(Exp e)
          At undecay expression node.
protected  void atUntil(LoopStmt s)
          At do-while statement node.
protected  Exp atVar(VarNode e)
          At variable node.
protected  void atWhile(LoopStmt s)
          At while statement node.
protected  Exp atXor(Exp e)
          At xor expression node.
protected  Exp atXorAssign(Exp e)
          At xor-assign expression node.
protected  boolean inInitBlock()
          Return true if now processing in the initialization block.
protected  void message(int level, java.lang.String mes)
          Output debug message.
(package private)  IrList processPragmaItem(ParseString pParseString, java.lang.String pNextItem, IrList pList)
           
(package private)  Exp visitExp(Exp e)
           
 void visitProgram()
          Visit HIR program tree.
(package private)  void visitProgram(Program program)
          Visit HIR program tree.
(package private)  void visitStmt(Stmt s)
          Call appropriate method by operator of statement node.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

toHir

protected final ToHir toHir

hir

protected final HIR hir

sym

protected final Sym sym

toCast

protected final ToHirCast toCast

buffer

protected final SideEffectBuffer buffer

inverter

protected final ConditionInverter inverter

nowBlock

protected BlockStmt nowBlock
Now processing block (used to create initializer).


fDbgLevel

public final int fDbgLevel
Constructor Detail

ToHirCOpt

public ToHirCOpt(ToHir tohir)
Constructor.

Parameters:
tohir - Offers cooperation with the object of other packages.
Method Detail

message

protected void message(int level,
                       java.lang.String mes)
Output debug message.

Overrides:
message in class ToHirVisit
Parameters:
level - Debug level.
mes - Debug message.

atIf

protected void atIf(IfStmt s)
At if statement node.

Overrides:
atIf in class ToHirVisit
Parameters:
s - IfStmt

atWhile

protected void atWhile(LoopStmt s)
At while statement node.

Overrides:
atWhile in class ToHirVisit
Parameters:
s - LoopStmt

atFor

protected void atFor(LoopStmt s)
At for statement node.

Overrides:
atFor in class ToHirVisit
Parameters:
s - LoopStmt

atUntil

protected void atUntil(LoopStmt s)
At do-while statement node.

Overrides:
atUntil in class ToHirVisit
Parameters:
s - LoopStmt

atSwitch

protected void atSwitch(SwitchStmt s)
At switch statement node.

Overrides:
atSwitch in class ToHirVisit
Parameters:
s - SwitchStmt

atReturn

protected void atReturn(ReturnStmt s)
At return statement node.

Overrides:
atReturn in class ToHirVisit
Parameters:
s - ReturnStmt

atExpStmt

protected void atExpStmt(ExpStmt s)
At expression statement node.

Overrides:
atExpStmt in class ToHirVisit
Parameters:
s - ExpStmt

atVar

protected Exp atVar(VarNode e)
At variable node.

Overrides:
atVar in class ToHirVisit
Parameters:
e - Exp
Returns:
Exp

atCall

protected Exp atCall(FunctionExp e)
At function call expression node.

Overrides:
atCall in class ToHirVisit
Parameters:
e - Exp
Returns:
Exp

atNot

protected Exp atNot(Exp e)
At not expression node.

Overrides:
atNot in class ToHirVisit
Parameters:
e - Exp
Returns:
Exp

atNeg

protected Exp atNeg(Exp e)
At negative expression node.

Overrides:
atNeg in class ToHirVisit
Parameters:
e - Exp
Returns:
Exp

atAddr

protected Exp atAddr(Exp e)
At address expression node.

Overrides:
atAddr in class ToHirVisit
Parameters:
e - Exp
Returns:
Exp

atDecay

protected Exp atDecay(Exp e)
At decay expression node.

Overrides:
atDecay in class ToHirVisit
Parameters:
e - Exp
Returns:
Exp

atUndecay

protected Exp atUndecay(Exp e)
At undecay expression node.

Overrides:
atUndecay in class ToHirVisit
Parameters:
e - Exp
Returns:
Exp

atContents

protected Exp atContents(Exp e)
At indirection expression node.

Overrides:
atContents in class ToHirVisit
Parameters:
e - Exp
Returns:
Exp

atEqZero

protected Exp atEqZero(Exp e)
At logical-not expression node.

Overrides:
atEqZero in class ToHirVisit
Parameters:
e - Exp
Returns:
Exp

inInitBlock

protected boolean inInitBlock()
Return true if now processing in the initialization block.

Returns:
boolean

visitProgram

public final void visitProgram()
Visit HIR program tree.


visitProgram

final void visitProgram(Program program)
Visit HIR program tree.

Parameters:
program - Program

visitStmt

final void visitStmt(Stmt s)
Call appropriate method by operator of statement node.

Parameters:
s - Visited statement.

atBlock

protected void atBlock(BlockStmt s)
At block statement node.

Parameters:
s - BlockStmt

atLabeledStmt

protected void atLabeledStmt(LabeledStmt s)
At labeled statement node.

Parameters:
s - LabeledStmt

atAssignStmt

protected void atAssignStmt(AssignStmt s)
At assign statement node.

Parameters:
s - AssignStmt

atJump

protected void atJump(JumpStmt s)
At goto statement node.

Parameters:
s - JumpStmt

atSetDataStmt

protected void atSetDataStmt(SetDataStmt s)
At datacode statement node.

Parameters:
s - SetDataStmt

visitExp

final Exp visitExp(Exp e)

atConst

protected Exp atConst(ConstNode e)
At constant node.

Parameters:
e - Exp
Returns:
Exp

atSubp

protected Exp atSubp(SubpNode e)
At function node.

Parameters:
e - Exp
Returns:
Exp

atElem

protected Exp atElem(ElemNode e)
At element node.

Parameters:
e - Exp
Returns:
Exp

atSubs

protected Exp atSubs(Exp e)
At subscript expression node.

Parameters:
e - Exp
Returns:
Exp

atIndex

protected Exp atIndex(Exp e)
At index expression node.

Parameters:
e - Exp
Returns:
Exp

atQual

protected Exp atQual(Exp e)
At member-access expression node.

Parameters:
e - Exp
Returns:
Exp

atArrow

protected Exp atArrow(Exp e)
At arrow expression node.

Parameters:
e - Exp
Returns:
Exp

atAdd

protected Exp atAdd(Exp e)
At add expression node.

Parameters:
e - Exp
Returns:
Exp

atSub

protected Exp atSub(Exp e)
At sub expression node.

Parameters:
e - Exp
Returns:
Exp

atMul

protected Exp atMul(Exp e)
At mul expression node.

Parameters:
e - Exp
Returns:
Exp

atDiv

protected Exp atDiv(Exp e)
At div expression node.

Parameters:
e - Exp
Returns:
Exp

atMod

protected Exp atMod(Exp e)
At mod expression node.

Parameters:
e - Exp
Returns:
Exp

atAnd

protected Exp atAnd(Exp e)
At and expression node.

Parameters:
e - Exp
Returns:
Exp

atOr

protected Exp atOr(Exp e)
At or expression node.

Parameters:
e - Exp
Returns:
Exp

atXor

protected Exp atXor(Exp e)
At xor expression node.

Parameters:
e - Exp
Returns:
Exp

atCmpEq

protected Exp atCmpEq(Exp e)
At EQ expression node.

Parameters:
e - Exp
Returns:
Exp

atCmpNe

protected Exp atCmpNe(Exp e)
At NE expression node.

Parameters:
e - Exp
Returns:
Exp

atCmpGt

protected Exp atCmpGt(Exp e)
At GT expression node.

Parameters:
e - Exp
Returns:
Exp

atCmpGe

protected Exp atCmpGe(Exp e)
At GE expression node.

Parameters:
e - Exp
Returns:
Exp

atCmpLt

protected Exp atCmpLt(Exp e)
At LT expression node.

Parameters:
e - Exp
Returns:
Exp

atCmpLe

protected Exp atCmpLe(Exp e)
At LE expression node.

Parameters:
e - Exp
Returns:
Exp

atLShift

protected Exp atLShift(Exp e)
At L-shift expression node.

Parameters:
e - Exp
Returns:
Exp

atARShift

protected Exp atARShift(Exp e)
At arithmetic R-shift expression node.

Parameters:
e - Exp
Returns:
Exp

atRShift

protected Exp atRShift(Exp e)
At logical R-shift expression node.

Parameters:
e - Exp
Returns:
Exp

atConv

protected Exp atConv(Exp e)
At cast expression node.

Parameters:
e - Exp
Returns:
Exp

atAssign

protected Exp atAssign(Exp e)
At assign expression node.

Parameters:
e - Exp
Returns:
Exp

atOffset

protected Exp atOffset(Exp e)
At offset(difference of address) expression node.

Parameters:
e - Exp
Returns:
Exp

atLgAnd

protected Exp atLgAnd(Exp e)
At logical-and expression node.

Parameters:
e - Exp
Returns:
Exp

atLgOr

protected Exp atLgOr(Exp e)
At logical-or expression node.

Parameters:
e - Exp
Returns:
Exp

atSelect

protected Exp atSelect(Exp e)
At selection expression node.

Parameters:
e - Exp
Returns:
Exp

atComma

protected Exp atComma(Exp e)
At comma expression node.

Parameters:
e - Exp
Returns:
Exp

atPre

protected Exp atPre(int op,
                    Exp e)
At pre-operator expression node.

Parameters:
e - Exp
Returns:
Exp

atPost

protected Exp atPost(int op,
                     Exp e)
At post-operator expression node.

Parameters:
e - Exp
Returns:
Exp

atAddAssign

protected Exp atAddAssign(Exp e)
At add-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atSubAssign

protected Exp atSubAssign(Exp e)
At sub-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atMulAssign

protected Exp atMulAssign(Exp e)
At mul-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atDivAssign

protected Exp atDivAssign(Exp e)
At div-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atModAssign

protected Exp atModAssign(Exp e)
At mod-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atLShiftAssign

protected Exp atLShiftAssign(Exp e)
At L-shift-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atRShiftAssign

protected Exp atRShiftAssign(Exp e)
At R-shift-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atAndAssign

protected Exp atAndAssign(Exp e)
At and-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atOrAssign

protected Exp atOrAssign(Exp e)
At or-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atXorAssign

protected Exp atXorAssign(Exp e)
At xor-assign expression node.

Parameters:
e - Exp
Returns:
Exp

atExpList

protected Exp atExpList(ExpListExp e)
At expression list node.

Parameters:
e - Exp
Returns:
Exp

atExpRepeat

protected Exp atExpRepeat(Exp e)
At expression repeatation node.

Parameters:
e - Exp
Returns:
Exp

atSubpDefinition

protected SubpDefinition atSubpDefinition(SubpDefinition s)
At block statement node.

Parameters:
s - BlockStmt

atInfStmt

protected InfStmt atInfStmt(InfStmt pInf)
atInfStmt parses the pragma body in the form of String and change its symbols to instances of Sym (Var, Subp, Label, Const) and items enclosed in parenthesis to IrList changing its elements to Sym, etc. This may be called twice for the same pragma. In the second call, return pInf unchanged because it is already in the final form.

Returns:
InfStmt having Sym elements and (nested) IrList.

processPragmaItem

IrList processPragmaItem(ParseString pParseString,
                         java.lang.String pNextItem,
                         IrList pList)