@@ -189,6 +189,38 @@ static void wipe_all_leaked_pointers(KnowledgeBase* kb) {
189
189
}
190
190
}
191
191
192
+ static const Node * find_or_request_known_ptr_value (Context * ctx , KnowledgeBase * kb , const Node * optr ) {
193
+ IrArena * a = ctx -> rewriter .dst_arena ;
194
+ PtrKnowledge * ok = get_last_valid_ptr_knowledge (kb , optr );
195
+ const Node * known_value = get_known_value (kb , ok );
196
+ if (known_value ) {
197
+ const Type * known_value_t = known_value -> type ;
198
+ bool kv_u = deconstruct_qualified_type (& known_value_t );
199
+
200
+ const Type * load_result_t = rewrite_node (& ctx -> rewriter , optr -> type );
201
+ bool lrt_u = deconstruct_qualified_type (& load_result_t );
202
+ deconstruct_pointer_type (& load_result_t );
203
+ // assert(!lrt_u || kv_u);
204
+ if (is_reinterpret_cast_legal (load_result_t , known_value_t )) {
205
+ const Node * n = prim_op_helper (a , reinterpret_op , singleton (load_result_t ), singleton (known_value ));
206
+ if (lrt_u && !kv_u )
207
+ n = prim_op_helper (a , subgroup_assume_uniform_op , empty (a ), singleton (known_value ));
208
+ return n ;
209
+ }
210
+ } else {
211
+ const KnowledgeBase * phi_kb = kb ;
212
+ while (phi_kb -> dominator_kb ) {
213
+ phi_kb = phi_kb -> dominator_kb ;
214
+ }
215
+ debug_print ("mem2reg: It'd sure be nice to know the value of " );
216
+ log_node (DEBUG , optr );
217
+ debug_print (" at phi-like node %s.\n" , get_abstraction_name (phi_kb -> cfnode -> node ));
218
+ // log_node(DEBUG, phi_location->node);
219
+ insert_set_get_key (const Node * , phi_kb -> potential_additional_params , optr );
220
+ }
221
+ return NULL ;
222
+ }
223
+
192
224
static PtrKnowledge * find_or_create_ptr_knowledge_for_updating (Context * ctx , KnowledgeBase * kb , const Node * optr , bool create ) {
193
225
Rewriter * r = & ctx -> rewriter ;
194
226
PtrKnowledge * k = get_last_valid_ptr_knowledge (kb , optr );
@@ -311,33 +343,9 @@ static const Node* process_instruction(Context* ctx, KnowledgeBase* kb, const No
311
343
}
312
344
case load_op : {
313
345
const Node * optr = first (payload .operands );
314
- PtrKnowledge * ok = get_last_valid_ptr_knowledge (kb , optr );
315
- const Node * known_value = get_known_value (kb , ok );
316
- if (known_value ) {
317
- const Type * known_value_t = known_value -> type ;
318
- bool kv_u = deconstruct_qualified_type (& known_value_t );
319
-
320
- const Type * load_result_t = rewrite_node (& ctx -> rewriter , optr -> type );
321
- bool lrt_u = deconstruct_qualified_type (& load_result_t );
322
- deconstruct_pointer_type (& load_result_t );
323
- // assert(!lrt_u || kv_u);
324
- if (is_reinterpret_cast_legal (load_result_t , known_value_t )) {
325
- const Node * n = prim_op_helper (a , reinterpret_op , singleton (load_result_t ), singleton (known_value ));
326
- if (lrt_u && !kv_u )
327
- n = prim_op_helper (a , subgroup_assume_uniform_op , empty (a ), singleton (known_value ));
328
- return n ;
329
- }
330
- } else {
331
- const KnowledgeBase * phi_kb = kb ;
332
- while (phi_kb -> dominator_kb ) {
333
- phi_kb = phi_kb -> dominator_kb ;
334
- }
335
- debug_print ("mem2reg: It'd sure be nice to know the value of " );
336
- log_node (DEBUG , first (payload .operands ));
337
- debug_print (" at phi-like node %s.\n" , get_abstraction_name (phi_kb -> cfnode -> node ));
338
- // log_node(DEBUG, phi_location->node);
339
- insert_set_get_key (const Node * , phi_kb -> potential_additional_params , optr );
340
- }
346
+ const Node * known_value = find_or_request_known_ptr_value (ctx , kb , optr );
347
+ if (known_value )
348
+ return known_value ;
341
349
// const Node* other_ptr = get_known_address(&ctx->rewriter, ok);
342
350
// if (other_ptr && optr != other_ptr) {
343
351
// return prim_op_helper(a, load_op, empty(a), singleton(other_ptr));
0 commit comments