@@ -134,21 +134,23 @@ private module SizeBarrier {
134134 * Holds if `small <= large + k` holds if `g` evaluates to `testIsTrue`.
135135 */
136136 additional predicate isSink (
137- DataFlow :: Node small , DataFlow :: Node large , IRGuardCondition g , int k , boolean testIsTrue
137+ ValueNumber small , ValueNumber large , IRGuardCondition g , int k , boolean testIsTrue
138138 ) {
139139 // The sink is any "large" side of a relational comparison. i.e., the `large` expression
140140 // in a guard such as `small <= large + k`.
141- g .comparesLt ( small . asOperand ( ) , large . asOperand ( ) , k + 1 , true , testIsTrue )
141+ g .comparesLt ( small , large , k + 1 , true , testIsTrue )
142142 }
143143
144- predicate isSink ( DataFlow:: Node sink ) { isSink ( _, sink , _, _, _) }
144+ predicate isSink ( DataFlow:: Node sink ) {
145+ isSink ( _, valueNumberOfOperand ( sink .asOperand ( ) ) , _, _, _)
146+ }
145147 }
146148
147149 module SizeBarrierFlow = DataFlow:: Global< SizeBarrierConfig > ;
148150
149- private int getASizeAddend ( DataFlow :: Node node ) {
151+ private int getASizeAddend ( ValueNumber node ) {
150152 exists ( DataFlow:: Node source |
151- SizeBarrierFlow:: flow ( source , node ) and
153+ SizeBarrierFlow:: flow ( source , DataFlow :: operandNode ( node . getAUse ( ) ) ) and
152154 hasSize ( _, source , result )
153155 )
154156 }
@@ -157,10 +159,10 @@ private module SizeBarrier {
157159 * Holds if `small <= large + k` holds if `g` evaluates to `edge`.
158160 */
159161 private predicate operandGuardChecks (
160- IRGuardCondition g , Operand small , DataFlow :: Node large , int k , boolean edge
162+ IRGuardCondition g , ValueNumber small , ValueNumber large , int k , boolean edge
161163 ) {
162- SizeBarrierFlow:: flowTo ( large ) and
163- SizeBarrierConfig:: isSink ( DataFlow :: operandNode ( small ) , large , g , k , edge )
164+ SizeBarrierFlow:: flowTo ( DataFlow :: operandNode ( large . getAUse ( ) ) ) and
165+ SizeBarrierConfig:: isSink ( small , large , g , k , edge )
164166 }
165167
166168 /**
@@ -170,15 +172,15 @@ private module SizeBarrier {
170172 */
171173 Instruction getABarrierInstruction0 ( int delta , int k ) {
172174 exists (
173- IRGuardCondition g , ValueNumber value , Operand small , boolean edge , DataFlow :: Node large
175+ IRGuardCondition g , ValueNumber value , ValueNumber small , boolean edge , ValueNumber large
174176 |
175177 // We know:
176178 // 1. result <= value + delta (by `bounded`)
177179 // 2. value <= large + k (by `operandGuardChecks`).
178180 // So:
179181 // result <= value + delta (by 1.)
180182 // <= large + k + delta (by 2.)
181- small = value . getAUse ( ) and
183+ small = value and
182184 operandGuardChecks ( pragma [ only_bind_into ] ( g ) , pragma [ only_bind_into ] ( small ) , large ,
183185 pragma [ only_bind_into ] ( k ) , pragma [ only_bind_into ] ( edge ) ) and
184186 bounded ( result , value .getAnInstruction ( ) , delta ) and
0 commit comments