C#: Improve performance of SSA adjacent reads calculation

- Speedup the `varBlockReaches()` predicate, by restricting to basic blocks
  in which a given SSA definition may still be live, in constrast to just
  being able to reach *any* access (read or write) to the underlying source
  variable.
- Account for some missing cases in the `lastRead()` predicate.
This commit is contained in:
Tom Hvitved
2019-08-07 16:55:04 +02:00
parent d0a761477b
commit 5ecf680cc2
3 changed files with 179 additions and 133 deletions

View File

@@ -265,77 +265,6 @@ private int maxSsaRefRank(PreBasicBlock bb, SimpleAssignable a) {
not result + 1 = ssaRefRank(bb, _, a, _)
}
private predicate reachesEndOf(Definition def, SimpleAssignable a, PreBasicBlock bb) {
exists(int last | last = maxSsaRefRank(bb, a) | defReachesRank(bb, def, a, last))
or
exists(PreBasicBlock mid |
reachesEndOf(def, a, mid) and
not exists(ssaRefRank(mid, _, a, SsaDef())) and
bb = mid.getASuccessor()
)
}
private predicate varOccursInBlock(SimpleAssignable a, PreBasicBlock bb) {
exists(ssaRefRank(bb, _, a, _))
}
pragma[nomagic]
private predicate blockPrecedesVar(SimpleAssignable a, PreBasicBlock bb) {
varOccursInBlock(a, bb.getASuccessor*())
}
private predicate varBlockReaches(SimpleAssignable a, PreBasicBlock bb1, PreBasicBlock bb2) {
varOccursInBlock(a, bb1) and
bb2 = bb1.getASuccessor() and
blockPrecedesVar(a, bb2)
or
varBlockReachesRec(a, bb1, bb2) and
blockPrecedesVar(a, bb2)
}
pragma[nomagic]
private predicate varBlockReachesRec(SimpleAssignable a, PreBasicBlock bb1, PreBasicBlock bb2) {
exists(PreBasicBlock mid | varBlockReaches(a, bb1, mid) |
bb2 = mid.getASuccessor() and
not varOccursInBlock(a, mid)
)
}
private predicate varBlockStep(SimpleAssignable a, PreBasicBlock bb1, PreBasicBlock bb2) {
varBlockReaches(a, bb1, bb2) and
varOccursInBlock(a, bb2)
}
private predicate adjacentVarRefs(
SimpleAssignable a, PreBasicBlock bb1, int i1, PreBasicBlock bb2, int i2
) {
exists(int rankix |
bb1 = bb2 and
rankix = ssaRefRank(bb1, i1, a, _) and
rankix + 1 = ssaRefRank(bb2, i2, a, _)
)
or
ssaRefRank(bb1, i1, a, _) = maxSsaRefRank(bb1, a) and
varBlockStep(a, bb1, bb2) and
ssaRefRank(bb2, i2, a, _) = 1
}
predicate firstReadSameVar(Definition def, AssignableRead read) {
exists(SimpleAssignable a, PreBasicBlock b1, int i1, PreBasicBlock b2, int i2 |
adjacentVarRefs(a, b1, i1, b2, i2) and
defAt(b1, i1, def, a) and
readAt(b2, i2, read, a)
)
}
predicate adjacentReadPairSameVar(AssignableRead read1, AssignableRead read2) {
exists(SimpleAssignable a, PreBasicBlock bb1, int i1, PreBasicBlock bb2, int i2 |
adjacentVarRefs(a, bb1, i1, bb2, i2) and
readAt(bb1, i1, read1, a) and
readAt(bb2, i2, read2, a)
)
}
pragma[noinline]
private predicate ssaDefReachesEndOfBlockRec(PreBasicBlock bb, Definition def, SimpleAssignable a) {
exists(PreBasicBlock idom | ssaDefReachesEndOfBlock(idom, def, a) | idom.immediatelyDominates(bb))
@@ -351,3 +280,82 @@ predicate ssaDefReachesEndOfBlock(PreBasicBlock bb, Definition def, SimpleAssign
liveAtExit(bb, a) and
not ssaRef(bb, _, a, SsaDef())
}
private predicate ssaDefReachesReadWithinBlock(
SimpleAssignable a, Definition def, PreBasicBlock bb, int i
) {
defReachesRank(bb, def, a, ssaRefRank(bb, i, a, SsaRead()))
}
private predicate ssaDefReachesRead(SimpleAssignable a, Definition def, PreBasicBlock bb, int i) {
ssaDefReachesReadWithinBlock(a, def, bb, i)
or
ssaRef(bb, i, a, SsaRead()) and
ssaDefReachesEndOfBlock(bb.getAPredecessor(), def, a) and
not ssaDefReachesReadWithinBlock(a, _, bb, i)
}
private int ssaDefRank(Definition def, PreBasicBlock bb, int i) {
exists(SimpleAssignable a |
a = def.getAssignable() and
result = ssaRefRank(bb, i, a, _)
|
ssaDefReachesRead(a, def, bb, i)
or
defAt(bb, i, def, a)
)
}
private predicate varOccursInBlock(Definition def, PreBasicBlock bb, SimpleAssignable a) {
exists(ssaDefRank(def, bb, _)) and
a = def.getAssignable()
}
pragma[noinline]
private PreBasicBlock getAMaybeLiveSuccessor(Definition def, PreBasicBlock bb) {
result = bb.getASuccessor() and
not varOccursInBlock(_, bb, def.getAssignable()) and
ssaDefReachesEndOfBlock(bb, def, _)
}
private predicate varBlockReaches(Definition def, PreBasicBlock bb1, PreBasicBlock bb2) {
varOccursInBlock(def, bb1, _) and
bb2 = bb1.getASuccessor()
or
exists(PreBasicBlock mid | varBlockReaches(def, bb1, mid) |
bb2 = getAMaybeLiveSuccessor(def, mid)
)
}
private predicate varBlockReachesRead(Definition def, PreBasicBlock bb1, AssignableRead read) {
exists(PreBasicBlock bb2, int i2 |
varBlockReaches(def, bb1, bb2) and
ssaRefRank(bb2, i2, def.getAssignable(), SsaRead()) = 1 and
readAt(bb2, i2, read, _)
)
}
private predicate adjacentVarRead(Definition def, PreBasicBlock bb1, int i1, AssignableRead read) {
exists(int rankix, int i2 |
rankix = ssaDefRank(def, bb1, i1) and
rankix + 1 = ssaDefRank(def, bb1, i2) and
readAt(bb1, i2, read, _)
)
or
ssaDefRank(def, bb1, i1) = maxSsaRefRank(bb1, def.getAssignable()) and
varBlockReachesRead(def, bb1, read)
}
predicate firstReadSameVar(Definition def, AssignableRead read) {
exists(PreBasicBlock bb1, int i1 |
defAt(bb1, i1, def, _) and
adjacentVarRead(def, bb1, i1, read)
)
}
predicate adjacentReadPairSameVar(AssignableRead read1, AssignableRead read2) {
exists(Definition def, PreBasicBlock bb1, int i1 |
readAt(bb1, i1, read1, _) and
adjacentVarRead(def, bb1, i1, read2)
)
}

View File

@@ -667,63 +667,82 @@ module Ssa {
)
}
/** Holds if `v` is defined or read in basic block `bb`. */
private predicate varOccursInBlock(TrackedVar v, BasicBlock bb) {
exists(ssaRefRank(bb, _, v, _))
}
/** Holds if `v` occurs in `bb` or one of `bb`'s transitive successors. */
private predicate blockPrecedesVar(TrackedVar v, BasicBlock bb) {
varOccursInBlock(v, bb)
or
blockPrecedesVar(v, bb.getASuccessor())
}
/**
* Holds if `bb2` is a transitive successor of `bb1` and `v` occurs in `bb1` and
* in `bb2` or one of its transitive successors but not in any block on the path
* between `bb1` and `bb2`.
* Same as `ssaRefRank()`, but restricted to actual reads of `def`, or
* `def` itself.
*/
private predicate varBlockReaches(TrackedVar v, BasicBlock bb1, BasicBlock bb2) {
varOccursInBlock(v, bb1) and
bb2 = bb1.getASuccessor() and
blockPrecedesVar(v, bb2)
or
varBlockReachesRec(v, bb1, bb2) and
blockPrecedesVar(v, bb2)
private int ssaDefRank(TrackedDefinition def, TrackedVar v, BasicBlock bb, int i) {
v = def.getSourceVariable() and
result = ssaRefRank(bb, i, v, _) and
(
ssaDefReachesRead(_, def, bb.getNode(i), ActualRead())
or
definesAt(def, bb, i, _)
)
}
private int maxSsaDefRefRank(BasicBlock bb, TrackedVar v) {
result = ssaDefRank(_, v, bb, _) and
not result + 1 = ssaDefRank(_, v, bb, _)
}
private predicate varOccursInBlock(TrackedDefinition def, BasicBlock bb, TrackedVar v) {
exists(ssaDefRank(def, v, bb, _))
}
pragma[noinline]
private predicate varBlockReachesRec(TrackedVar v, BasicBlock bb1, BasicBlock bb2) {
exists(BasicBlock mid | varBlockReaches(v, bb1, mid) |
bb2 = mid.getASuccessor() and
not varOccursInBlock(v, mid)
private BasicBlock getAMaybeLiveSuccessor(Definition def, BasicBlock bb) {
result = bb.getASuccessor() and
not varOccursInBlock(_, bb, def.getSourceVariable()) and
ssaDefReachesEndOfBlock(bb, def, _)
}
/**
* Holds if `def` is accessed in basic block `bb1` (either a read or a write),
* `bb2` is a transitive successor of `bb1`, and `def` is *maybe* read in `bb2`
* or one of its transitive successors, but not in any block on the path between
* `bb1` and `bb2`.
*/
private predicate varBlockReaches(TrackedDefinition def, BasicBlock bb1, BasicBlock bb2) {
varOccursInBlock(def, bb1, _) and
bb2 = bb1.getASuccessor()
or
exists(BasicBlock mid | varBlockReaches(def, bb1, mid) |
bb2 = getAMaybeLiveSuccessor(def, mid)
)
}
/**
* Holds if `bb2` is a transitive successor of `bb1` and `v` occurs in `bb1` and
* `bb2` but not in any block on the path between `bb1` and `bb2`.
* Holds if `def` is accessed in basic block `bb1` (either a read or a write),
* `def` is read at `cfn`, `cfn` is in a transitive successor block of `bb1`,
* and `def` is not read in any block on the path between `bb1` and `cfn`.
*/
private predicate varBlockStep(TrackedVar v, BasicBlock bb1, BasicBlock bb2) {
varBlockReaches(v, bb1, bb2) and
varOccursInBlock(v, bb2)
private predicate varBlockReachesRead(
TrackedDefinition def, BasicBlock bb1, ControlFlow::Node cfn
) {
exists(BasicBlock bb2, int i2 |
varBlockReaches(def, bb1, bb2) and
ssaRefRank(bb2, i2, def.getSourceVariable(), SsaRead()) = 1 and
variableRead(bb2, i2, _, cfn, _)
)
}
/**
* Holds if `v` is accessed at index `i1` in basic block `bb1` and at index `i2` in
* basic block `bb2` and there is a path between them without any access to `v`.
* Holds if `def` is accessed at index `i1` in basic block `bb1` (either a read
* or a write), `def` is read at `cfn`, and there is a path between them without
* any read of `def`.
*/
private predicate adjacentVarRefs(TrackedVar v, BasicBlock bb1, int i1, BasicBlock bb2, int i2) {
exists(int rankix |
bb1 = bb2 and
rankix = ssaRefRank(bb1, i1, v, _) and
rankix + 1 = ssaRefRank(bb2, i2, v, _)
private predicate adjacentVarRead(
TrackedDefinition def, BasicBlock bb1, int i1, ControlFlow::Node cfn
) {
exists(int rankix, int i2 |
rankix = ssaDefRank(def, _, bb1, i1) and
rankix + 1 = ssaDefRank(def, _, bb1, i2) and
variableRead(bb1, i2, _, cfn, _)
)
or
ssaRefRank(bb1, i1, v, _) = maxSsaRefRank(bb1, v) and
varBlockStep(v, bb1, bb2) and
ssaRefRank(bb2, i2, v, _) = 1
exists(SourceVariable v | ssaDefRank(def, v, bb1, i1) = maxSsaDefRefRank(bb1, v)) and
varBlockReachesRead(def, bb1, cfn)
}
cached
@@ -736,23 +755,26 @@ module Ssa {
*/
cached
predicate lastRead(TrackedDefinition def, ControlFlow::Node cfn) {
exists(TrackedVar v, BasicBlock bb, int i, int rnk |
exists(def.getAReadAtNode(cfn)) and
variableRead(bb, i, v, cfn, _) and
rnk = ssaRefRank(bb, i, v, SsaRead())
exists(BasicBlock bb1, int i1, int rnk, TrackedVar v |
variableRead(bb1, i1, v, cfn, _) and
rnk = ssaDefRank(def, v, bb1, i1)
|
// Next reference to `v` inside `bb` is a write
rnk + 1 = ssaRefRank(bb, _, v, SsaDef())
// Next reference to `v` inside `bb1` is a write
rnk + 1 = ssaRefRank(bb1, _, v, SsaDef())
or
// No next reference to `v` inside `bb`
rnk = maxSsaRefRank(bb, v) and
// No more references to `v` inside `bb1`
rnk = maxSsaDefRefRank(bb1, def.getSourceVariable()) and
(
// Read reaches end of enclosing callable
not varBlockReaches(v, bb, _)
// Can reach exit directly
bb1 instanceof ControlFlow::BasicBlocks::ExitBlock
or
// Read reaches an SSA definition in a successor block
exists(BasicBlock bb2 | varBlockReaches(v, bb, bb2) |
1 = ssaRefRank(bb2, _, v, SsaDef())
exists(BasicBlock bb2 | varBlockReaches(def, bb1, bb2) |
// Can reach a write using one or more steps
1 = ssaRefRank(bb2, _, def.getSourceVariable(), SsaDef())
or
// Can reach a block using one or more steps, where `def` is no longer live
not varOccursInBlock(def, bb2, _) and
not ssaDefReachesEndOfBlock(bb2, def, _)
)
)
)
@@ -831,10 +853,9 @@ module Ssa {
*/
cached
predicate firstReadSameVar(TrackedDefinition def, ControlFlow::Node cfn) {
exists(TrackedVar v, BasicBlock b1, int i1, BasicBlock b2, int i2 |
adjacentVarRefs(v, b1, i1, b2, i2) and
definesAt(def, b1, i1, v) and
variableRead(b2, i2, v, cfn, _)
exists(BasicBlock bb1, int i1 |
definesAt(def, bb1, i1, _) and
adjacentVarRead(def, bb1, i1, cfn)
)
}
@@ -845,10 +866,9 @@ module Ssa {
*/
cached
predicate adjacentReadPairSameVar(ControlFlow::Node cfn1, ControlFlow::Node cfn2) {
exists(TrackedVar v, BasicBlock bb1, int i1, BasicBlock bb2, int i2 |
adjacentVarRefs(v, bb1, i1, bb2, i2) and
variableRead(bb1, i1, v, cfn1, _) and
variableRead(bb2, i2, v, cfn2, _)
exists(TrackedDefinition def, BasicBlock bb1, int i1 |
variableRead(bb1, i1, _, cfn1, _) and
adjacentVarRead(def, bb1, i1, cfn2)
)
}
}

View File

@@ -1,7 +1,9 @@
| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:33:13:33:13 | access to parameter i |
| Capture.cs:6:16:6:16 | i | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:12:17:12:17 | access to parameter i |
| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:14:17:14:17 | access to parameter i |
| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:39:13:39:13 | access to parameter i |
| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:34:13:34:13 | access to local variable x |
| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:17:21:17:21 | access to local variable x |
| Capture.cs:8:13:8:13 | x | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:21:21:21:21 | access to local variable x |
| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:40:13:40:13 | access to local variable x |
| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:44:11:44:11 | access to local variable x |
@@ -35,12 +37,17 @@
| Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:24:92:24 | access to parameter d |
| Capture.cs:94:13:94:13 | y | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:98:21:98:21 | access to local variable y |
| Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:99:20:99:20 | access to local variable x |
| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:106:20:106:20 | access to local variable z |
| Capture.cs:114:13:114:13 | a | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:117:21:117:21 | access to local variable a |
| Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:118:17:118:17 | access to local variable x |
| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:126:17:126:17 | access to local variable b |
| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:134:17:134:17 | access to local variable c |
| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:137:13:137:13 | access to local variable c |
| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:145:13:145:13 | access to local variable d |
| Capture.cs:147:13:147:13 | e | Capture.cs:148:9:152:9 | SSA capture def(e) | Capture.cs:150:17:150:17 | access to local variable e |
| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:155:13:155:13 | access to local variable f |
| Capture.cs:162:13:162:13 | g | Capture.cs:163:9:166:9 | SSA capture def(g) | Capture.cs:165:17:165:17 | access to local variable g |
| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:177:17:177:17 | access to local variable h |
| Capture.cs:182:17:182:17 | i | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:185:21:185:21 | access to local variable i |
| Capture.cs:197:17:197:17 | i | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:198:43:198:43 | access to local variable i |
| Capture.cs:197:17:197:17 | i | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:203:44:203:44 | access to local variable i |
@@ -56,6 +63,8 @@
| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i |
| Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:27:13:27:13 | access to local variable c |
| Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:27:13:27:19 | access to field Field |
| Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:33:9:33:9 | access to parameter c |
| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:39:39:39 | access to local variable i |
| Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:46:13:46:13 | access to local variable s |
| Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:47:49:47 | access to parameter a |
| Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | SSA param(i) | Consistency.cs:49:49:49:49 | access to parameter i |
@@ -64,6 +73,7 @@
| DefUse.cs:3:26:3:26 | w | DefUse.cs:19:13:19:18 | SSA def(w) | DefUse.cs:20:17:20:17 | access to parameter w |
| DefUse.cs:3:26:3:26 | w | DefUse.cs:23:9:23:15 | SSA phi(w) | DefUse.cs:24:13:24:13 | access to parameter w |
| DefUse.cs:3:26:3:26 | w | DefUse.cs:29:13:29:18 | SSA def(w) | DefUse.cs:53:17:53:17 | access to parameter w |
| DefUse.cs:5:13:5:13 | x | DefUse.cs:5:13:5:17 | SSA def(x) | DefUse.cs:26:13:26:13 | access to local variable x |
| DefUse.cs:5:13:5:13 | x | DefUse.cs:5:13:5:17 | SSA def(x) | DefUse.cs:56:16:56:16 | access to local variable x |
| DefUse.cs:6:14:6:14 | y | DefUse.cs:6:14:6:19 | SSA def(y) | DefUse.cs:8:13:8:13 | access to local variable y |
| DefUse.cs:6:14:6:14 | y | DefUse.cs:13:13:13:18 | SSA def(y) | DefUse.cs:14:17:14:17 | access to local variable y |
@@ -80,6 +90,8 @@
| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:73:13:73:13 | access to local variable i |
| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:76:9:76:9 | access to local variable i |
| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:77:13:77:13 | access to local variable i |
| DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:64:13:64:18 | access to field Field2 |
| DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:80:37:80:42 | access to field Field2 |
| DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:69:13:69:18 | access to field Field3 |
| DefUse.cs:67:19:67:20 | tc | DefUse.cs:67:19:67:27 | SSA def(tc) | DefUse.cs:68:9:68:10 | access to local variable tc |
| DefUse.cs:79:13:79:14 | x1 | DefUse.cs:80:16:80:46 | SSA phi(x1) | DefUse.cs:80:30:80:31 | access to local variable x1 |
@@ -100,6 +112,7 @@
| DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:157:13:157:18 | access to field Field4 |
| DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:163:13:163:18 | access to field Field4 |
| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:169:13:169:13 | access to parameter i |
| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:174:17:174:17 | access to parameter i |
| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:178:21:178:21 | access to parameter i |
| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:182:13:182:13 | access to parameter i |
| DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:181:9:181:9 | access to local variable a |
@@ -135,6 +148,7 @@
| Fields.cs:33:19:33:22 | Fields.stat | Fields.cs:34:9:34:16 | SSA call def(Fields.stat) | Fields.cs:37:13:37:16 | access to field stat |
| Fields.cs:33:19:33:22 | Fields.stat | Fields.cs:38:9:38:13 | SSA call def(Fields.stat) | Fields.cs:41:13:41:16 | access to field stat |
| Fields.cs:33:19:33:22 | Fields.stat | Fields.cs:51:9:51:20 | SSA call def(Fields.stat) | Fields.cs:54:13:54:16 | access to field stat |
| Fields.cs:65:24:65:32 | this.LoopField | Fields.cs:61:17:61:17 | SSA entry def(this.LoopField) | Fields.cs:65:24:65:32 | access to field LoopField |
| Fields.cs:77:13:77:13 | f | Fields.cs:77:13:77:45 | SSA def(f) | Fields.cs:90:19:90:19 | access to local variable f |
| Fields.cs:77:13:77:13 | f | Fields.cs:78:27:78:54 | SSA capture def(f) | Fields.cs:78:35:78:35 | access to local variable f |
| Fields.cs:78:23:78:23 | a | Fields.cs:78:23:78:54 | SSA def(a) | Fields.cs:81:9:81:9 | access to local variable a |
@@ -171,10 +185,12 @@
| OutRef.cs:19:32:19:38 | t.Field | OutRef.cs:18:13:18:28 | SSA qualifier def(t.Field) | OutRef.cs:19:32:19:38 | access to field Field |
| OutRef.cs:19:32:19:38 | t.Field | OutRef.cs:19:32:19:38 | SSA def(t.Field) | OutRef.cs:21:13:21:19 | access to field Field |
| OutRef.cs:28:37:28:37 | j | OutRef.cs:28:37:28:37 | SSA param(j) | OutRef.cs:30:13:30:13 | access to parameter j |
| OutRef.cs:34:38:34:38 | j | OutRef.cs:34:38:34:38 | SSA param(j) | OutRef.cs:36:13:36:13 | access to parameter j |
| OutRef.cs:39:24:39:24 | b | OutRef.cs:39:24:39:24 | SSA param(b) | OutRef.cs:41:13:41:13 | access to parameter b |
| Patterns.cs:7:16:7:16 | o | Patterns.cs:7:16:7:23 | SSA def(o) | Patterns.cs:20:17:20:17 | access to local variable o |
| Patterns.cs:8:22:8:23 | i1 | Patterns.cs:8:18:8:23 | SSA def(i1) | Patterns.cs:10:38:10:39 | access to local variable i1 |
| Patterns.cs:12:30:12:31 | s1 | Patterns.cs:12:23:12:31 | SSA def(s1) | Patterns.cs:14:41:14:42 | access to local variable s1 |
| Patterns.cs:24:22:24:23 | i2 | Patterns.cs:24:18:24:23 | SSA def(i2) | Patterns.cs:24:30:24:31 | access to local variable i2 |
| Patterns.cs:24:22:24:23 | i2 | Patterns.cs:24:18:24:23 | SSA def(i2) | Patterns.cs:25:47:25:48 | access to local variable i2 |
| Patterns.cs:27:22:27:23 | i3 | Patterns.cs:27:18:27:23 | SSA def(i3) | Patterns.cs:28:42:28:43 | access to local variable i3 |
| Patterns.cs:30:25:30:26 | s2 | Patterns.cs:30:18:30:26 | SSA def(s2) | Patterns.cs:31:45:31:46 | access to local variable s2 |
@@ -200,6 +216,7 @@
| Properties.cs:33:19:33:22 | Properties.stat | Properties.cs:38:9:38:13 | SSA call def(Properties.stat) | Properties.cs:41:13:41:16 | access to property stat |
| Properties.cs:33:19:33:22 | Properties.stat | Properties.cs:51:9:51:24 | SSA call def(Properties.stat) | Properties.cs:54:13:54:16 | access to property stat |
| Properties.cs:61:23:61:23 | i | Properties.cs:63:16:63:16 | SSA phi(i) | Properties.cs:63:16:63:16 | access to parameter i |
| Properties.cs:65:24:65:31 | this.LoopProp | Properties.cs:61:17:61:17 | SSA entry def(this.LoopProp) | Properties.cs:65:24:65:31 | access to property LoopProp |
| Properties.cs:73:13:73:13 | f | Properties.cs:73:13:73:32 | SSA def(f) | Properties.cs:86:19:86:19 | access to local variable f |
| Properties.cs:73:13:73:13 | f | Properties.cs:74:27:74:54 | SSA capture def(f) | Properties.cs:74:35:74:35 | access to local variable f |
| Properties.cs:74:23:74:23 | a | Properties.cs:74:23:74:54 | SSA def(a) | Properties.cs:77:9:77:9 | access to local variable a |
@@ -240,6 +257,7 @@
| Test.cs:9:13:9:13 | y | Test.cs:25:16:25:16 | SSA phi(y) | Test.cs:31:13:31:13 | access to local variable y |
| Test.cs:9:13:9:13 | y | Test.cs:25:16:25:16 | SSA phi(y) | Test.cs:43:20:43:20 | access to local variable y |
| Test.cs:10:13:10:13 | z | Test.cs:24:9:24:15 | SSA phi(z) | Test.cs:24:13:24:13 | access to local variable z |
| Test.cs:34:18:34:18 | i | Test.cs:34:25:34:25 | SSA phi(i) | Test.cs:34:25:34:25 | access to local variable i |
| Test.cs:34:18:34:18 | i | Test.cs:34:25:34:25 | SSA phi(i) | Test.cs:34:33:34:33 | access to local variable i |
| Test.cs:39:22:39:22 | w | Test.cs:39:22:39:22 | SSA def(w) | Test.cs:41:23:41:23 | access to local variable w |
| Test.cs:46:16:46:18 | in | Test.cs:46:16:46:18 | SSA param(in) | Test.cs:48:13:48:15 | access to parameter in |