Data dependences, which relate statements that compute data values to statements that use those values, are useful for automating a variety of program-comprehension-related activities, such as reverse engineering, impact analysis, and debugging. Unfortunat
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.
algorithmComputeReachingDefsinputCFGcontrol- owgraphforprogram
GEN(n)setofde nitionsthataregeneratedatnoden
setofde nitionsthatarede nitelykilledatnodenKILLd(n)
KILLp(n)setofde nitionsthatarepossiblykilledatnoden
outputINd(n)setofde nitionsthatde nitelyreachnoden
setofde nitionsthatde nitelyreachtheendofnodenOUTd(n)
INp(n)setofde nitionsthatpossiblyreachnodenOUTp(n)setofde nitionsthatpossiblyreachtheendofnodenINk(n)setofkilledde nitionsthatreachnoden
setofkilledde nitionsthatreachtheendofnodenOUTk(n)
declarechange agtoindicateifthevalueofanOUTd(n),OUTp(n),orOUTk(n)changedfrom
apreviousiteration
oldoutdvalueofOUTd(n)fromthepreviousiterationoldoutpvalueofOUTp(n)fromthepreviousiteration
valueofOUTk(n)fromthepreviousiterationoldoutk
beginComputeReachingDefs
foreachnoden∈CFGdoOUT(n)=GEN(n)endforchange=truewhilechangedo
change=false
foreachnoden∈CFGdo
/*compute INd(n),saveOUTd(n),andrecomputeOUTd(n)*/INd(n)=OUTd(p),wherepisapredecessorofnintheCFGoldoutd=OUTd(n)
OUTd(n)=GEN(n)∪(INd(n) KILLd(n) KILLp(n))/*compute INp(n),saveOUTp(n),andrecomputeOUTp(n)*/INp(n)=OUTp(p),wherepisapredecessorofnintheCFGoldoutp=OUTp(n)
OUTp(n)=(INp(n) KILLd(n))∪(INd(n)∩KILLp(n))/*computeINk(n),saveOUTk(n),andrecomputeOUTk(n)*/ INk(n)=OUTk(p),wherepisapredecessorofnintheCFGoldoutk=OUTk(n)
OUTk(n)=INk(n)∪(INd(n)∪INp(n)∩KILLd(n))
ifoldout=OUT(n)oroldout=OUT(n)oroldout=OUT(n)then
change=trueendifendforendwhile
endComputeReachingDefs
Figure5:Thealgorithmforcomputingreachingde nitionstoidentifydef-useassociationsofdi erenttypes.