@@@@@@@@@@@@@@@@@@2003/6/14
@uD@t[̊Tv
@@@@@@@@@@@@@@@@@@(##21: 2003/06 )
@@@@@@@@@@@@@@@@@@(##14: 2002/06 )
@@@@@@@@@@@@@@@@@@(##10: 2001/11 )
@@@@@@@@@@@@@@@@@@(##9 : 2001/10 j
PD@t[̍\

iPjt[̂܂Ƃ߂@(##9)
@񉻂œKɂẮAvO{ubNɕA
Ƃɐ̗͂邽߂̐t[Af[^̗͂
f[^t[߁ȀɊÂăvOϊsȂƂ
BŁA񉻂œK̊bƂȂ鐧t[f[^t[
̑́A{ubNɕtBvOɂďԂ𑽂
̂́As郋[vȂ̂ŁAɑ΂Ă͓ʂ̔z
ȂB[vɑ΂񉻁AœK̏̓[vƂĂ܂Ƃ߂B
̎dlł́At[ƃf[^t[킹ăt[
ĂсAt[͂ƃf[^t[͂킹ăt[͂ƌĂ(##10)B
@KwIȕ񉻂̂߂ɂ́A[v̊{ubNЂƂ܂Ƃ߂
ĈƂv邪A̎dlɂẮA񉻂̕
̉Ăݒ肷B
@{ubN̏JavãC^tF[XBBlockăANZXA
[vJavãC^tF[XLoopInfăANZXB
@t[̎̂́A{ubNm[hi߁jƂAsA
㑱֌WŐڑt[OtiCFG, control flow graphjŕ\B
̐t[͂̎dlł́APɃm[hƌΊ{ubN\
ƂAȊÔ̂\Ƃ́AHIRm[hȂǂƂ悤ɁA̎|
ƂBCFG͕vOƂɍBvO̓
ꍇ́AzIȓ{ubN݂AvO̎ۂ̓ɑ
{ubN͂̉zI{ubNsubNƂ邱
ɂACFG̓{ubN͂PɂBvȌo
ꍇ́AzIȏo{ubN݂AvO̎ۂ̏o
Ή{ubN͂̉zIo{ubN㑱ubNƂ邱
ƂɂACFG̏o{ubN͂PɂB
@f[^t[ɂ́A{ubN̋ǏIf[^t[ƁA{
ubNԂ̑If[^t[񂪂BǏIf[^t[͓
̏W[̒Ɍ肷`Ŏg邱Ƃ̂ŁA̕\͌
ʂɒ߂邱ƂɂA̎dlł́AvOƂɍIf
[^t[ɂďqׂBf[^t[́AƂāAX̊{
ubN̓AoŃf[^ǂ̂悤ȏԂɂ邩`ŕ\B
f[^t[߂ɂ͂܂t[OtKvB
@vÕt[́AJavãC^tF[XSubpFlowăA
NZXBP̕vOɑ΂œK񉻂̏sȂƂ
́ASubpFlow炻̕vOɑ΂鐧t[f[^t
[ւ̃pX߁AX̃f[^ɃANZXBt[Ŝ
C^tF[XƂFlowƂ̂B
@RpC̃vO\ƂẮAC^tF[XƎ
ĂÂ悤ȑΉ֌WB
@@C^tF[X@@
@@@Flow   @@@@FlowImpl
@@@Subp   @@@@SubpImpl
@@@BBlock @@@@BBlockImpl
@@@LoopInf@@@@LoopInfImpl
@@@xxx    @@@@xxxImpl

@ꂼ̕vÕt[́At[ɂĂ͐t[
OtiCFGjANZXĂ䂫Af[^t[ɂẮACFG̃m[
hł{ubNƂɃANZX̂BݒEQƏ̂悤
ɁAL\ANZXł̂B
@vOԂ̃t[̎dlɂẮAvOԉ͂̕
̉Ă߂B
@ʖɂĂAʖ͂̉̕Ădl߂B
@t[̕\`ɂHIRLIRŋʂ镔Bf[^t[
֘ÃC^tF[Xɂ́Aq̂悤ɁAHIRLIRŋʂɂĂ
B

iQjt[Ƒ̏Ƃ̊֘A	(##10)
@t[͐t[̓W[ŎZoAf[^t[
f[^t[̓W[ŎZoB񉻂œK̂߂ɂǂ̂悤
ϊs΂悢́A̐t[f[^t[񂾂
Ĕfł̂邪AHIRLIR𑖍Ȃϊ邱ƂAL
ĂɊ֘Af[^t[邱ƂBŁAHIRł́A
{ubN̋؂⃋[v̌_@ƂȂHIRm[hɃf[^t[
̃NtAHIR𑖍ĂƂɃf[^t[QƉ\
BLIR͊{ubNm[hƂ鐧t[Ot̂̂LIR
\ƂĂÅ{ubNLIR̕؂̒PȂ郊XgƂ
\Ƃ̂ŁAt[߂ĎZoKv͂Ȃ(##21)B
@܂AL\̕vOɂ́A̓{ubN`CFG
̃Nݒ肵ĂAxɑ΂Ă͂ɑΉ{ubNւ
NAϐȂǑ΂ẮAf[^̐ݒEQƃXgȂǂ̏ւ
NBtɁA{ubŃA̐擪̖߂ɑΉHIRm
[hLIRm[hւ̃NB̂悤ɂāACFGȂf[^
t[QƂ邱ƂA{ubN␧t[ȂΉ
HIRLIRQƂ邱Ƃł悤ɂȂĂBit[͂ő
ۂƂHIRHIR-Cł͂ȂHIR-basełA̎dlHIRƌ
HIR-basêƂłBj	(##9)
@@HIR@@@@@[[[[[[[[[[[[[[[
@@@@@@@@@b@@@@@@@@@@@@@@@b
@@@@@@@@@b@@@@@@t[@@b
@@L\@@@bt[@@@@@@@@@b
@@@@@@@@@b@@@@@@f[^t[@b
@@@@@@@@@b@@@@@@@@@@@@@@@b
@@LIR@@@@@[[[[[[[[[[[[[[[
@CFG͊{ubNm[hƂAsA㑱֌WӂƂOtłA
f[^t[̑͊{ubNɕtꂽȂ̂ŁACFG
f[^t[QƂ邱ƂłB@(##9)

iRjt[͂̑Oił̎Oϊ@(##10)
@HIR̐t[͂sȂɂ́A܂AvO{ubN
KvBHIRɂ{ubN̎n܂́Ax`m[
hŎBHIRł́Aifthenelse̐擪A[v̖߂_ȂǁA
̕_ƍ_ɂ́ARpCŐx
ŁA{ubN̏ÍA؍\[DōEւ̏ő
ƂɎ̃x`m[hɏoOA܂͂P̕vȌI
ɂċ؂iSDPߎQƁjBāAvOHIR
̊{ubNɕ邱Ƃ́Â悤ȓ肪Ɋ{ubN
̋؂At[ւ̃N邱ƂɑB
Iɂ́AHIRł͊{ubN̐擪ƂȂHIRm[hɑ΂Ċ{ubN
̃CX^Xւ̃NBHIRɑ΂Đt[͂sȂ
͊{ubNւ͍̕sȂB
@LIŔAłɏqׂ悤ɁA{ubNm[hƂ鐧t[O
t̂̂Ƃĕ\ĂÅ{ubNɂ́AL̃Xg
ڊ܂܂ĂBāALIR͉߂Ċ{ubNɕKv
(##21jB
@HIRłLIRłAcall͊{ubN̐؂ڂƂĈȂB
@f[^t[͂sȂɂ́At[Ot쐬A߂悤Ƃ
f[^t[ɍ킹āAe{ubNɂ̓ꏊpӂB
(##9)
@[vɑ΂񉻂œK̏́ASȓq\[v
ΏۂƂ邱ƂBłȂ[v́A\Ȃ΂̂悤ȃ[v
ϊĂƂ]܂(##9)B

iSjt[̍XV@
@{RpCł́A\[XvOHIRoRLIRɕϊ̂A
R[hsȂBLIRHIRɋtϊ邱Ƃ͑z肵ĂȂBLIR
ɕϊƂAHIRƂɎZot[ƃf[^t[
ƂAKvȏLIRpɎZoȂBA[v
̈ꕔ́AHIRŎZôLIRłp邱ƂB	(##9)
@uʒԕ\dl̊Tvvŏqׂ悤ɁAf[^t[͂́A
œK̂߂ɑ傫vOϊsȂƂł͍ČvZBv
Oϊ̉ߒŃf[^t[𒀈XV`Ԃ͂ƂȂAP
̕ϊW[̒ł̕ϊɎgf[^t[XVKv
΁A͂̕ϊW[̒ōXVB
@t[̌vZ͑IIɍsȂAɑSXV킯ł͂ȂB
̃t[vZsȂ́A񉻂œKŉv邩ňقȂBt
[̌vZɂ͏֌WA y  x ɊÂČvZA
x ς y ςȂ΁Ay  x ɏ]ƂBČv
Zꍇ́Aɏ]ČvZKvAƂ̏]
𖳌ɂKvB̂悤ȏ̏]֌ẂAIɔł
̂邪Aʂɂ́Aʂ̃t[͂ȂvOϊ̃W[
쐬ɑΏ̂ƂB
@ z  x ɊÂČvZ͂邪AvOϊ̓e x ɂ
eĂ z ɉe܂łɂ͎Ȃ̂ł΁Az vZȂ
Kv͂ȂB̂悤ȏꍇAz ͂̃vOϊŕsςłƂB
ǂ̃vOŉ͍̏ČvZA͌̏𗘗p邩́Aʂ
vOϊ̃W[̍쐬AȂRpC̐vO
Ώ̂ƂB
@ANZX\bhƂẮAIIɖ݂̂B
ꂽXVėpɂ́AČvZKvBL
ƂĂăRpC\邱ƂɂAHIRŉ͂ē
œKLIR֓`邱ƁAɃR[h܂œ`邱Ƃ
\łB


QD@{ubN

@P̕vO̊{ubN̏W܂́AsipredecessorjA
isuccessorj֌WӁiedgejƂČ邱ƂɂāAP̃O
t\B
{ubNPʂ̐t[OtiCFGjƂBt[
ƂẮÂ悤Ȃ̂߂BǂZo邩̓IvVł邪A
HIR̃t[͂ɂẮA{ubNւ̕Ƃ̐sA㑱֌W
͕KZoB
@@@sA㑱֌W
@@@xz
@@@txz
@@@{ubN܂ލœ[vւ̃N
@@@[vwb_i[v̐擪{ubNjۂ
@@@[v̋Aӂ̏o{ubNۂ
@@@[v̒Eoӂ̏o{ubNۂ
@@@[vvwb_i[v̓{ubNjۂ
@{ubNɋL^\̂ƂẮAq̃f[^t[
ȊOɁA
@@@spx
@@@㑱ubNւ̕ӂ̑ΓIm
@@@Zq̐
@@@[h߂̐
@@@\zs
ȂǂB͏펞vZĂ̂ł͂ȂA񉻂œK̃W
[A邢͂̏W[őIIɎZoAƂĕt
̂łAt[͂sȂƂ炪ׂċ܂ĂƂ
ł͂ȂB
@xz؂̏ƂẮAeX̊{ubNɑ΂āA𒼐ڂɎxz
{ubNAȂ킿xz؂ɂeĂB܂Aꂼ
̊{ubNɑ΂āAꂪڂɎxz{ubÑXg𓾂
\bhpӂĂBɂĎxz؂̏𓾂邱ƂłB
txz؂ɂĂAlɁAe{ubNɑ΂āA𒼐ڂɋtxz
{ubNƁAꂪڂɋtxz{ubÑXgAȂ
xz؂ɂq̃XgA𓾂郁\bhpӂĂB@(##9)

@{ubNɑ΂f[^t[ƂẮÂ悤Ȃ̂߂B
ׂĂ펞߂Ă̂ł͂ȂAf[^t[͂̐䃂
W[܂̓f[^t[͎wp[^ɂAIIɋ߂
̂łBŁAp ̓vO_AȂ킿HIRLIRɂĕ⎮
Ȃǂ\؂̍\Ap(def(x)) ͕ϐ\L x `
ilݒ肷j؂\B

  Def(B)  = 
            { p | for some x, p(def(x)) is included in B and after 
                 that point there is no def(x) in B. } 
  Kill(B) = 
            { p | for some x, p(def(x)) is included in B' 
                  (where, B' != B) and there exists some definition 
                  point of x p'(def(x)) in B. }
  Reach(B)= 
            { p | there is some path from program point p 
                  defining x (that is p(def(x))) to the entry of B
                  such that there is no p'(def(x)) on that path. }
              Reach(B) = or_all( (Def(B') | (Reach(B') - Kill(B')))
                               for all predecessors B' of B)
  Defined(B) = 
            { x | x is set in B. }
  Exposed(B) =  
            { x | x is used in B and x is not set in B 
                  before x is used. }
  EGen(B) =
            { op(x,y) | expression op(x,y) is computed in B and after 
                        that point, neither x nor y are set in B. }
              Thus, the result of op(x,y) is available after B.
  EKill(B) =
            { op(x,y) | operand x or y is defined in B and the 
                        expression op(x,y) is not re-evaluated after 
                        that definition in B. }
              If t = op(x,y) is killed in B,
              then op(t,u) should also be killed in B. 
  AvailIn(B) =
            { op(x,y) | op(x,y) is computed in every paths to B and 
                        x, y are not set after the computations 
                        on the paths. }
              Thus, the result of op(x,y) can be used without
              re-evaluation in B.
  AvailOut(B) =
            { op(x,y) | op(x,y) is computed in every path to the exit 
                       of B and x, y are not set after the 
                       computations on the paths. }
            Following relations hold.
              AvailIn(B) = and_all(AvailOut(B') for all predecessors 
                               B' of B) if B is not an entry block;
              AvailIn(B) = { } if B is an entry block.
              AvailOut(B) = EGen(B) | (AvailIn(B) - EKill(B))
  LiveIn(B) =
            { x | x is alive at entry to B, that is, on some path from
               entrance point of B to use point of x, x is not set. }
  LiveOut(B) =
            { x | x is live at exit from B, that is, there is some 
                  path from B to B' where x is in Exposed(B'). }
          Following relations hold.
            LiveOut(B) = or_all(LiveIn(B') for all successors B' of B)
            LiveIn(B)  = Exposed(B) | (LiveOut(B) - Defined(B))
  DefIn(B) =
          { x | x is always defined at entry to B whichever path 
                may be taken. }
            DefIn(B) = and_all(DefOut(B') for all predecessors B' of B)
  DefOut(B) =
          { x | x is always defined at exit from B whichever path 
                may be taken.}
            DefOut(B) = Defined(B) | DefIn(B)

ˑ֌W@@@
@@@t[ˑ
@@@tˑ
@@@o͈ˑ
@@@͈ˑ

tF[Yʏ
@@œK񉻂̂ꂼ̃tF[YŌʂɗp
@@ێł悤ɁA̓ꏊpӂĂigetWork(), 
setWork()jB
@@JavaObjectNXƂĂ̂ŁAe͔CӂɐݒłB

tO
@@tOԍi1 ~ 31j w肵āAɑΉtrue/false
@@L^łigetFlag(), setFlag()jBX̃tOԍ\
@@K̂ƂɎRɐݒłiFlagBoxC^tF[XQƁjB


RD@[v

@[vɂ́Afor-loop, while-loop, repeat-until-loopAgotoɂ郋[
vAȂтɁA[vwWϐƂ̎nlAIlAlw肷
IndexedLoopiFortranDO[vjBHIRłLoopN
X̃TuNXƂč\邪At[ƂĂAKw[
vNXƂč\Bfor[vwhile[vȂǂʂ
Kv̂ȂLoopInf̏Ƃ̃\bh𗘗pčsB
    LoopInf  
      |-- ForLoopInf
      |      |-- DoAllLoopInf
      |-- WhileLoopInf
      |-- UntilLoopInf
      |-- IndexedLoopInf@(##9)
      |-- GotoLoopInf@(##10)

@[vɑ΂ċLڂȏ͎̂悤Ȃ̂\肵Ă邪Aڂ
̓[v͏̎dlQƂꂽ(##9)B
@@e[v
@@q[vXg
@@A[ϐXg
@@{ubN
@@Jn莮
@@I莮
@@[v{̂\{ubÑXg@
@@picontinuej{ubN
@@Xebv{ubNiA[ϐ̏sȂ{ub
Nj
@@[vxiJn_ArEoApAI_j
@@ȃ_NV֐iaAőlAŏlj
@@ꎞz񃊃Xg
@@etO
@@@@񉻉
@@@@\ȕ񉻂̎
@@@@call̕܂̗L
@@@@gotoɂяo̗L
@@@@smݒi|CgA\̗vfAւ̐ݒj̗L


SD@{ubNɂ鏈e̕\@@

SDP@HIRɑ΂{ubN@

iPjHIRƊ{ubN
@HIRł́AP̑I𕶂┽͕̊{ubNɂ܂BP
{ubŃA̕܂ނƂA܂܂ȂiPj
Ƃč\邱ƂBP̊{ubŃArƂ
ɑ򖽗߂ō\邱ƂB]āAHIR̍\PʂƊ{u
bN̋؂́APȕ܊֌Wł͕\ȂBɏqׂ悤ɁA{u
bN̐擪ɂ̓xĂǍł͂P̎܂͕n
B{ubN̋؂́AifȂǂ̂P̕ȑOɗ邱
ƂA̕Ƃɗ邱ƂB
@HIRɂ{ubN̊Jn_͋̓Iɂ͎̂悤ɂȂBƕtL
Ă̂͋̊{ubNꍇ邱ƂĂB
@@@vO̐擪
@@@ifthen̐擪ithenȂƋ̊{ubN邱
j
@@@ifelse̐擪ielseȂƋ̊{ubN邱
j
@@@if̏I_
@@@\[Xx`ix`AĂƂ͂킹
@@@@@@@@@@@@P{ubNɂ܂Ƃ߂j
@@@for̃[vJn_A[v{̂̐擪AI_A
@@@@@[vXebv_A[vI_
@@@whilẽ[vJn_A[v{̂̐擪AI_ijA
@@@@@[vXebv_ijA[vI_
@@@until̃[vJn_ijA[v{̂̐擪AI_A
@@@@@[vXebv_ijA[vI_
@@@switch̊eI̐擪switchI_
@@@jump̒
@@@return̒
if̏foȑݒ蕔͒O̊{ubN̉ƂĈA
iffor, while, until̐䕶̒ɂ郉xȂ́̕A
̐䕶̏I_Ŏn܂{ubN̉ƂĈB@(##10)
@HIRł́A{ubN̋؂͂܂PłȂ̂ŁA{ubN
̖̒߂𑖍ɂ́ȀڂɎ悤ɁApɏꂽC
e[^g(##9)B̃Ce[^́A╶̋؂ɂƂꂸ
ɁAP̊{ubNɊ܂܂鎮╶A邢͂̈ꕔ
(##10)B
@{ubŃAPȂ鎮܂͕̗ƌ邱Ƃł邪AHIR̕
؂̈ꕔƌ邱ƂłB̂ɂ̂ݒڂO҂̌ł́At
[͊{ubÑOtŕ\ĂƂāAt[K肷
ifwhileHIRm[hA邢͕܂Ƃ߂ubNm[h͌A
Ɋ܂܂鎮A֐ďoȂǂs鏇Ԃɍ킹ď
oƂB{ubN𕔕؂̈ꕔƂĈ҂̌ł́A
̊{ubNɊ܂܂i̊{ubNJn_̒O܂ł́jHIRm
[hAifwhileAubN܂߂āAS邱ƂłB̌
̈Ⴂ́AgCe[^ł邩ɂċʂB

iQj{ubN̎̂ɂ̂ݒڂꍇ
@{ubN̎̂ɂ̂ݒڂƂ́A\\킷ŎI
Z\킳Ȃm[h̓XLbvAA܂͕{̂\؁itop-
subtreeĵ݂sɂďANZX邱ƂłBif
͏߂܂ފ{ubNƁAthen\{ubNQAelse\
{ubNQɕB߂܂ފ{ubN̎̂o
ƁAifm[hł͂ȂA߂̕؂oBthenïꕔj
܂ފ{ubN̎̂oƁAthenPłƂ̕{
̂oAthenubNł΃ubN̒̕̕{̂
oBwhile͏߂܂ފ{ubNƁA[v{̂\
{ubNQɕB[v{́ïꕔj\{ubN̎
oƁA[v{̂Pł΂̕{̂oA[v
{̂ubNł΃ubN̒̕̕{̂oB̂悤
ɁA{ubN܂܂Ȃō\Ƃ͂̎oA
܂܂ȂiPj̗ō\Ƃ͂̒P̕{̂
XƎoB
@̓Iɂ́ABBlockSubtreeIteratorƂCe[^pӂĂA
{ubNBɑ΂āA
@@@BBlockSubtreeIterator  subtreeIterator;
@@@HIR  currentSubtree;
@@@subtreeIterator = B.bblockSubtreeIterator();
@@@currentSubtree = subtreeIterator.next();
Ǝw肷ƁAB̒̍ŏ̎܂͕\؂currentSubtree
ĎoB̂ƂA{ubN̐擪ɂĂ
labeledStmtNode̓XLbvāAsubtreeIterator͂̉ɂ镶{
ɈʒuÂBiA{̂ȂlabeledStmtNodȅꍇ
labeledStmtNodêɈʒutBjʒuÂ悤Ƃ悪
blockNodełƁAɂ̃ubN̒̍ŏ̕\؂Ɉʒu
ÂAꂪnext()ɂĎoB
@ȌA
@@@currentSubtree = subtreeIterator.next();
ƂƁA̎̎܂͕\؂XƎoBŁA
̎܂͕Ƃ̂́AsubtreeIterator̈ʒuÂĂ鎮܂͕ 
x ƂƁA܂Ax Xg̗vfłΎ̃XgvfAx ł
Ύ̕Ax ̑̃m[h̑ i qł΂̃m[h̑ i+1 q̂
ƂӖBʒuÂ悤Ƃ悪blockNodełƁAɂ
ubN̒̍ŏ̕ɈʒuÂBcurrentSubtreeubN̍
̕łƂnext()Ă΂ƁÃubN̎Ɉʒu鎮
ɈʒuÂAoB̂悤ɂāAubN͂̕
ubNň͂܂ĂȂ̂悤ɂǂĂ䂩BsubtreeIterator
̈ʒuÂ݂͌̊{ubN̒Ɍ肳B
@@@subtreeIterator.hasNext()
́AtrueAȂfalseԂB̂ȂA邢͎ɂ
XLbvHIRm[hȂnext()ĂԂƁAnullԂB
x擪ɂĂ镶x擪ɂĂwhile[v
until[v́AK{ubN̐擪ɂ̂ŁAQԖڈȍ~next()
ʒuÂ邱Ƃ͂ȂB
@C̃\[XvO
    l1: l2: a = 1;
̂悤ɂĂĂAxl1, l2 ̒`͂Ƃɕ a = 1; ̃x
`Xg̒Ɋ܂܂̂ŁAŏnext() a = 1; oĂāAQ
ڈȍ~next()ňʒuÂ邱Ƃ͂ȂBAStmtC^tF[X
ŗpӂĂ郁\bh
    attachLabel(label)
gȂŃx𕶂ɕtAx`PƂɍꍇɂ́A
P̑̕Oɕ̃x`邱ƂȀꍇ͋̊{u
bNBāAStmtC^tF[XɂȂ
Ă郁\bhgȂHIR𐶐ύX肷邱Ƃ́Ã
\bh܂@\ȂȂ邱Ƃ̂ŁAD܂ȂB@(##10)
@BBlockSubtreeIterator ɂ́Anext()̑ nextStmt() Ƃ\bh
AgƁAHIR̕ƂĂ̕؂݂̂oĂB{u
bNɂ́AifwhilȅAvO}Ȃǂ̏\Infm[hȂ
top-subtreeƂĊ܂܂邪AnextStmt()ł̓XLbvB@
(##9)
@̒Pʂł͂Ȃm[hPʂőƂ́Aɏqׂ
BBlockNodeIteratornextExecutableNode()Ƃ\bhgƁA
Z𔺂Ȃm[hƊ{ubN̐ڑ\킷jumpm[h̓XLbv
As\ȉZ\킷m[ĥ݂ANZX邱ƂłB

iRj{ubN𕔕؂̈ꕔƌꍇ
@{ubN̓eHIR\镔؂̈ꕔƂČꍇA
\m[hB̏HIR𑖍ꍇƓłB
̃\bhƂẮAׂẴm[h𑖍̂ƁAZ\
m[ĥ݂𑖍̂B̓Iɂ́ABBlockNodeIteratorƂ
iteratorpӂĂA{ubNBɑ΂āA
@@@BBlockNodeIterator  nodeIterator;
@@@HIR  currentNode;
@@@nodeIterator = B.bblockNodeIterator();
@@@currentNode = nodeIterator.next();
Ǝw肷ƁAB̐擪ɂlabeledStmtNode̓XLbv邪A
ɂ鎮╶currentNodeʒuÂB
@ȌA
@@@currentNode = nodeIterator.next();
ƂƁAB̒HIR̕؂ɑ΂āA[DōE֑
Ƃ̏ԂɂāAHIRm[ho(##9)BʒuÂ
݂͌̊{ubN̒Ɍ肳B
@@@nodeIterator.hasNext()
́AtrueAȂfalseԂB̂Ȃnext()ĂԂ
nullԂBnext()ł́A\w肷邽߂blockNodelistNodeA
ifNodeAforNodeAswitchNodeȂǂoĂB
@BBlockNodeIterator̂P̃\bhnextExecutableNode()ł́A
IȉZsȂm[ĥ݂oĂBȂ킿A
    progNode, subpDefNode, labelDefNode, infNode, subpNode, 
    typeNode, labelNode, blockNode, listNode, seqNode, encloseNode,
    labeledStmtNode, ifNode, forNode, whileNode, untilNode, 
    indexedLoopNode, jumpNode, switchNode, blockNode, expStmtNode, 
    nullNode
̓XLbvB

SDQ@LIRɑ΂{ubN@(##14)

@LIŔAłɏqׂ悤ɁA{ubNm[hƂ鐧t[O
t̂̂Ƃĕ\ĂÅ{ubN̓éALIR̖߂
\؂̒PȂ郊XgƂȂĂ(##21)B̑g̎d́A
𗘗pvOɔCĂB

SDR@t[͂ɂ\@(##9)

@t[͂̂ƂA_ZsȂƂ̂ŁȀrbg
xNgŕ\BȂ킿ArbgxNg̊eX̃rbgʒu\
߂ĂAނ̏ɑ΂_ZrbgxNgԂ̘_
Zɒu邱ƂɂAɎsB̂߂ɉނ̔ԍt
sȂBt[͂sȂƂ͂̂悤Ȕԍt͂ȂȂB
@rbgxNgpȂUIȕ\@Ȃǂ邪A͍ŏ̔
ł͗pӂĂȂB(##14)

iPj{ubNԍ
@t[͂Ŏxz؁Atxz؂߂ƂArbgxNgŎxz
W\B̂߁Ae{ubNɊ{ubNԍtA
rbgxNg̃rbgʒuɑΉBeX̊{ubNɑ΂āA
ꂪxz{ubNAxz{ubNrbgxNgŕ\
B

iQjvO_ԍiIRm[hԍj
@f[^t[͂̂ƂȀrbgxNgŕ\B̂߁A
eX̃vO_ɔԍBeX̊{ubNɑ΂āAB
`Ȃǂ̂悤ȃrbgxNgɂĕ\B݁AHIRɑ΂
́ARpC̃fobO̕֋XlāAvȌe\
؂ׂ̂ĂHIRm[hɔԍÂsȂĂ邪Aۂ̌vZɍۂ
ẮAf[^̐ݒsȂHIRm[hɑ΂Ă݂̂ԍ𗘗pĂ
ArbgxNgsKvɒȂȂ悤ɂĂB

iRjϐԍ
@ϐ̒l̐ݒEQƂ́AϐƂɂP̃rbgʒutAeX
{ubNɑ΂āAl𗘗p\ȕϐ͂ǂł邩ȂǂrbgxN
gɂĕ\Bԍtϐ́A錾ꂽϐSł͂ȂA
YvOŎۂɒl̐ݒAQƂϐ݂̂EođΏۂ
B

iSjԍ
@HIRɑ΂ẮAf[^t[͂̑Ώۂɂ̂ł͂ȂA
{ubNŎZoꂽAɂꂽAČvZ̕Kv̂Ȃ
ǂZ肷BHIRł͎͖؍\ŕ\Ał͉ZsȂeX̐
Ƃ镔؂ŕ\P̎\BŁAZsȂ
eX̐߂ɎWiExpId, expression identifierjA̎Wɂ
ԍŎ̃rbgxNgɂʒu\B̎Wꎞϐ
݂ȂȂ΁A͖؍\ԕ\Sgԕ\ɕϊꍇƓ
`Ńf[^t[͂ł邱ƂӖBƂ΁A
@@x = a + b * c;
Ƃɑ΂HIR
    (assign
     <var x>
     (add
      <var a>
      (mult 
       <var b>)
       <var c> ) ) )
ƂȂ邪Aaddm[ht1Amultm[ht2ƂExpIdΉ
Ȃ΁A
      assign
      /   \
    x     add    t1
         /  \
        a   mult  t2
            /  \
           b     c
Ƃ؍\ŕ\B̑ɑ΂f[^t[͂́At1, t2 
ꎞϐƂ݂
    t2 := b * c
    t1 := a + t2
    x := t1
ƂSgԕ\ɑ΂͂Ɠ`łłBȂ킿At2mult
Œlݒ肳AaddŎQƂƂ݂ȂAt1addŒlݒ肳A
assignŎQƂƂ݂ȂƂłB
@̂ƂAx = a + b * c; ̌ 
@@y = d + b * c;
ƂƂƁAb * c ̒l͉߂ČvZȂĂ悢ꍇB
ȒPɌ邱Ƃł悤ɂ邽߁A
      assign
      /   \
    y     add    t3
         /  \
        d   mult  t2
            /  \
           b     c
̂悤ɁAb * c ɑO̎̕Ɠt2ExpIdƂđΉȂ΁A

    t2 := b * c
    t3 := a + t2
    y := t3
ƂSgԕ\ɑΉ邱ƂɂȂB̂悤ɕ\ƁAQ
̊Ԃt2ZoƂ̃Iyh̒l b, c ɕωȂ΁A
 t2 ̌vZ͍폜ł邱Ƃ킩BāAi
؁jɂ͓WiExpIdjΉAϐ̒l̐ݒEQƊ֌W
ExpId̒l̐ݒEQƊ֌WΔ䂳邱ƂɂA{ubNԂł̋
ʎ̍폜ϐ̍ČvZ폜ƓW[Ŏsł邱Ƃ킩
B̏ꍇAExpIdԍ͕ϐԍ̈ƂĈƂłB
@HIRɑ΂ẮAL̂悤ɁA؂ɂ͓ExpIdΉ邱
ƂɂA̔ԍtĂB̗RɂĂ͕t^QƂꂽB
@LIRł́AP̕vO͕؂̗Ƃĕ\A̕؂
̕؂͎\Ă邪Ȃ͂P̋@B߂ŕ\ł悤
ȏłAHIRƂ͏قȂBLIRɂĂ͕؂̍
̂ݔԍt΃f[^t[͂邱ƂłB@(##14)

SDS@HIRLIRɑ΂t[̓W[̋p@(##9)

@HIRLIRIR̃TuNXłAHIRm[hLIRm[hIRm[h
̈łB҂ɂāA
@@{ubNɊ{ubNԍ
@@lݒ肷镔؂̍IRm[hɃvO_ԍ
@@ϐɕϐԍ
Ȃ΁Ǎ̐t[́Af[^t[͂́AHIRLIRɑ΂
̃W[ŎsłB{ubN̐sE㑱֌WHIRł
LIRłS`ŕ\BHIRɑ΂Ă͎ԍ͕ϐԍƓi
ɈALIRɑ΂Ă͉zWX^ɂԍĂϐԍƓi
ɈBLIRŋǏϐ(FRAME <Ltype> <String>)ƕ\AL抄t
sƃt[|C^̃ItZbgŕ\ꂽ肷邪A
悤ɕϊĂ̕ϐłL^ĂȂ΁Aϐԍ
邱Ƃ͉\łBiL̔ԍt̎dɂẮALIRƃt
[͕̎dlł߂iKł͂肳Bj
@HIRLIRŌʂɏȂ΂ȂȂ̂
@@{ubNւ̕
@@IRm[hւ̔ԍt
@@f[^̐ݒEQƈʒu̎Z
@@{ubNIRm[h̊Ԃ̃N̐ݒ
@@{ubNIR𑖍Ce[^̍쐬
@@ϐ⎮WAWX^ւ̔ԍt
ȂǂłBʂ̃W[ƂĎł̂
@@{ubN𑖍CFGCe[^
@@xz؁Atxz؁AxzӋ̎Zo
@@gotoō\郋[v̌o
@@f[^t[̋
@@@iReach, AvailIn, AvailOut, Aj
@@t[͌ʂ̕\
ȂǁAt[͂̎vȂłB


TD@t[Ot̕ύX@@@

TDP@HIRɑ΂{ubN̓e̕ύX

@{ubN̓e̕ύX́ÃIyh̕ύXAZq̕ύXA
폜AȂтɁA̒ǉA}A폜A̍\vf̕ύXȂǂ̌`ƂB
ɏqׂ悤ɁA{ubN̕ȂǁAgbvx̕؁i̍
m[hj𑖍ɂBBlcokSubtreeIteratorgB̒ǉA폜́A
gĕύXǉA폜镶ʒuÂ̂AaddNextStmt(HIR 
x, ) Ƃ\bhĂԂƁA݈ʒuÂĂ镶̎Ɂi
nextStmt()ƂƂĂłĂ镶̎OɁj x }B
deleteThisStmt()Ƃ\bhĂԂƁA݈ʒuÂĂ镶폜
BɂāAPʂƂǉ폜łB@(##21)
@{ubN̒̃gbvx̕؂̉ʂɂ\vfύX
Ƃ́ABBlockSubtreeIteratorŕύXΏۂƂgbvx̕؂Ɉ
uÂ̂AHirIterator𗘗pđΏۂƂvfʒuÂA
replaceThisNode()Ȃǂ̃\bhp邩A邢IR
    replaceSource1(IR pSourceOperand), 
    replaceSource2(IR pSourceOperand), 
    replaceSource( int pChildNumber, IR pOperand)
    replaceResultVar(IR pOperand)
Ȃǂ̊{Iȃ\bh𗘗pĕύXB̂ƂA{ubN̂
Ẵm[h𑖍BBlockNodeIteratorgĕύXΏۂʒuÂA
悤IR̃\bh𗘗pĕύXĂ悢B@(##9)
@L̂悤Ȋ{ubN̓e̕ύX́A{ubNɃNĂ
HIRύX̂łBtɁACFG猩̂ł͂ȂAHIR̂
HirIterator gđAύXsĂ悢BύX{ubN
Ɍ肳Ăꍇ́AX[Ot͕ςȂ̂CFG̏
͂̂܂ܗpł邪Af[^t[͍ČvZȂƎgȂȂB@
(##9)

TDQ@HIRɂ{ubÑOt\̕ύX

@œK񉻂ōsvOϊł́A{ubN̓eύX
݂ɂƂǂ܂炸ÃOt\ύX邱ƂB͊{Iɂ́A
{ubN̑}A폜Aӂ̑}A폜AύXł邪AvOƂ
Ă̈ӖۑS悤ȕϊł邽߁ASCӂ̕ύXƂ킯ł͂
B悭sϊ
@@@ӂ̓rւ̊{ubN̑}
@@@[vwb_̑}
@@@[v̏oւ̐VȊ{ubN̑}
@@@̕ύX
@@@ʂOt}
@@@ʂ̕Otɔzu
@@@iʂ̕Ot̓Pɂ܂Ƃ߁AoP
@@@@܂Ƃ߂邱ƂɂđɂĐڑAsj
@@@ɂȂ{ubN̍폜
@@@OtP̊{ubNɏk
ȂǂłB
@ʂɁA{ubN}ɂ́Aւ̗ӂƗoӂ̎wA
Ƃ̕ӂ̂Ȃ폜̎w肪KvłBƂ΁A{ubN
B1B2ւ̕ӂB3}ꍇAB1B2ւ̕ӂ́AB1B3ւ
ӂB3B2ւ̕ӂɕϊB܂A{ubNB1̑OB2}
ꍇAB1֗ӂB2֗AB2B1ւ̕ӂ\B
镔Ot}Ƃ́A̕Ot֗ӂƂ痬
oӂɑ΂āA̐ڑw肷BɂȂ{ubNB1
鎞́AB1ɗӂB1̗oɐڑB̂悤ȕϊ
łȂȂ̕ӂ̂Ȃ폜A}vꂽ肷B
@HIRłif-then-else⃋[vȂǂ̐\L̂ŁAt
σ\bh́Â悤ȍ\Ȃ͈͓ŎsłύXɌ
sȂB̊{ubN}ƂAHIȒΉnull
邪AɎnullɒuA΂̕vf
{ubNŒuB{ubNɕǉ΁AHIR̃u
bN̒ɕǉBif-then-else̊Os\iAoA
thenAelse̐ڑ֌Wj킳Ȃ͈͂Ŋ{ubNύX
́AHIRłAƂif-then-else̍\͕ێ܂܁A̍\
̕ύXsȂB[v̊Os\iAoAAӁAXebv̐ڑ
Wj킳Ȃ͈͂Ŋ{ubNύXꍇ́AHIRłAƂ̃
[v\ێ܂܂̓̍\ςBij
@if-then-else⃋[vȂǂ̌̊Os\킷悤ȕό`HIRɑ
čs悤wꍇA̎wɐ旧āAYf-then-else⃋
[vȂǂ̕gotogĕϊ邽߂̃\bhĂяoKv
B̕ϊ\bhɂāAύX܂if-then-else⃋[v
gotogďƁA̍\ɂƂȂύXs悤ɂ
Bij@(##9)
@HIR͖؍\Ȃ̂ŁAύXɂẮA؂Ƃ\킳Ȃ悤
Ȃ΂ȂȂBm[h╔؂ʂ̃m[hɐڑƁA}悪
ƂɂȂāA؍\łȂȂB{Iɂ́AVKɍ邩Rs[
čm[h╔؂ڑ悤ɂȂ΂ȂȂBRs[
ɂ͂P̃m[hRs[̂ł͂ȂAcopyWithOperands()̃\b
hgĕؑŜRs[Ȃ΂ȂȂBRs[Ώۂif┽
AubN̂悤ɕ܂ޕIȂ̂łꍇAx̕tւ
KvƂȂ̂ŁARs[ɂcopyWithOperandsChangingLabels(....)g
B

TDR@LIRɑ΂ύX (##21)

@LIR͊{ubÑOtƂ\ĂA{ubNɂL
̃XgĂ̂ŁA؂̉ςOt\̉ςA
̃vOŎRɕύXĂ悢Bjump╪򖽗߂ύXA
ɍ킹ăOt\ύXȂ΂ȂȂBȂ킿AׂĂ[
UӔCƂȂB


UD@ANZX\bh

@t[́AFlowRoot̃CX^XflowRootHIR܂LIRɑ΂
ĂApāAvOƂ
    controlFlowAnal
ĂԂƂ̕vO̐t[񂪍A
    dataFlowAnal
ĂԂƂ̕vÕf[^t[񂪍Bꂽt[
́A
    flowRoot.flow.getSubpFlow()
œ镛vOƂSubpFlowA邢
    flowRoot.flow.getSubpUnderAnalysis()
œ镛vO炽ǂ邱ƂłBڂFlow.java, 
BBlock.javaC^tF[XQƂꂽB

UDP@t[

@t[ɃANZXvȃ\bh̊TvBsubN
㑱ubÑXgȂǁAXg߂郁\bhł́Â
ListIteratorgČX̗vfɃANZXB

iPjvOANZX郁\bh
getEntryBBlock : vO̓{ubNAȂ킿
@@CFG̓߂BCFG̊em[hi{ubNj́A
@@SubpFlowcfgIterator(), cfgFromExitIterator()
@@ɂāA[Dłǂ邱ƂłB[DȊÔ肩
@@Ŋ{ubNANZXɂ́ABBlockgetPredList()C
@@getSuccList()gĐڑ֌WĎŃANZXB
getFirstLoopInfList : [v̖؂̍߂Biꕔj
@@Aq̃[vZ탋[vւƃANZXB
@@iLoopInfQƁj
iQjLabelANZX郁\bh
getBBlock : L\̃x炻̃x̕t^ꂽ{ubN
@@߂B
iRjHIRANZX郁\bh
@@HIRɂ́ACӂ̃m[h炻܂ފ{ubN߂
@@\bh
@@getBBlock()
@@pӂĂB
iSj{ubNANZX郁\bh
getBlockNumber : {ubNԍ߂B
getIrLink : {ubNɑΉHIR܂LIR̐擪̕
@@߂B
getPredList : subÑXg߂B
getSuccList : 㑱ubÑXg߂B
getPredEdge : w肳ꂽsubNւ̕ӂ߂B
getSuccEdge : w肳ꂽ㑱ubNւ̕ӂ߂B
getImmediateDominator : ڂɎxz{ubN߂B
getDominatedChildren : ڂɎxz{ubÑXg߂B
getImmediatePostDominator : ڂɋtxz{ubN߂B
getPostDominatedChildren : ڂɋtxz{ubÑXg
B
getFlag : tOԍ^ĂɑΉtrue/false߂B
setFlag : tOԍ^ĂɑΉtrue/falseݒ肷B
getWork : tF[Yʏ߂B
setWork : tF[Yʏ̃CX^Xݒ肷B

UDQ@f[^t[

iPj{ubNANZX郁\bh
isDef, isKill, isReach : vO_ԍŎw肳ꂽ`ilݒj
@@Def, Kill, ReachɊ܂܂Ă邩ۂ߂(##10)B
isDefined, isExposed, isLiveIn, isLiveOut, isDefIn, isDefOut :
@@
@@ϐw肵āAꂪDefined, Exposed, ... Ɋ܂܂Ă邩
@@ۂ߂(##10)B
isEGen, isEKill, isAvailIn, isAvailOut : 
@@Ww肵āAɑΉ鎮EGen, EKill, AvailIn, 
AvailOut
@@Ɋ܂܂Ă邩ۂ߂(##10)B
getDef, getKill, getReach, getDefined, getExposed, 
getEGen, getEKill, getAvailIn, getAvailOut, 
getLiveIn, getLiveOut, getDefIn, getDefOut : 
@@Def, Kill, ..., DefOut ̃rbgxNg߂B

iQjϐƃWX^ANZX郁\bh
getDefUseList : ϐ̐ݒEQƃXg߂B
getIndex: f[^v[͗pɂԍ߂B

iRjrbgxNgɑ΂郁\bh
getBit : wԍ̃rbgʒûOCPB
setBit : wԍ̃rbgʒuɂPݒ肷B
resetBit : wԍ̃rbgʒuɂOݒ肷B
vectorAnd : Q̃rbgxNg̘_ς߂B
vectorOr : Q̃rbgxNg̘_a߂B
vectorXor : Q̃rbgxNg̔rI_a߂B
vectorNot : rbgxNg̘_ے߂B
vectorSub : Q̃rbgxNg̍߂B
vectorCopy : rbgxNg̃Rs[B
vectorEqual : Q̃rbgxNgۂ߂B
vectorReset :
@@ rbgxNg̑SrbgOɂB
bitVectorInit : rbgxNg̃NXƂɂ̃rbg
@@w肵ăCX^X̍쐬static\bhB


t^@ɓWΉ邱Ƃ̌p

Ef[^t[͂ɂāAɑ΂̓[`ƕϐɑ΂̓
[`𓯈ꃂW[ŎłB
E؂ɓW邾ł́AWłꏊɂĒl
قȂ邱ƂɂȂ邪AɂāASSAōsȂ悤ɒlݒ肷邲
ƂɔhĂ䂫A̒l`dƂł͓h𗘗p
Ȃ΁Al̓̂𓯂Lŕ\ƂłB
EiIjʎ폜̏ȒPɂȂB
E⎮WJƂA̎WꎞϐƂĎgȂ΁A̒l
Zo鎮ł邩𒼂ɒm邱ƂłBāǍvZR
Xgƈꎞϐ̗pRXgrāAČvZRXgႢƂ킩
ƂACӂ̎_ōČvZ̎𕜌łB

ELIR̉zWX^ɂɑΉ鎮ExpIdł邩Ƃ
`Ă䂭Ȃ΁AWX^tsƂłACӂ̎_ł
WX^̓eł邩Ƃĕ\łB
EWX^tɍۂāAWX^gRXgƍČvZRXgr
āAČvZ悢Ƃ킩΁AČvZ̖ߗeՂɐłB
ELIRɂ܂ExpId̏`dȂ΁AHIRϊLɑ΂
ẮAɑΉHIŘ^ł邩ExpIdɂ^ɂĕ\
łBALIRɑ΂œK񉻂̉ߒŐꂽĽ^́A
^_̋KɂĒ߂KvB
ELIRɂ܂ExpId̏`dȂ΁AzWX^̓eł
邩\[XvOɋ߂Ƃĕ\ł̂ŁAfobKɑ΂ėL
pȏ𐶐łA܂ARpC̃fobÔeՂɂȂB

