Skip to content

Commit 18fd19e

Browse files
committed
mem2reg: lift "load" logic out
1 parent 60bd521 commit 18fd19e

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

src/shady/passes/opt_mem2reg.c

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,38 @@ static void wipe_all_leaked_pointers(KnowledgeBase* kb) {
189189
}
190190
}
191191

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+
192224
static PtrKnowledge* find_or_create_ptr_knowledge_for_updating(Context* ctx, KnowledgeBase* kb, const Node* optr, bool create) {
193225
Rewriter* r = &ctx->rewriter;
194226
PtrKnowledge* k = get_last_valid_ptr_knowledge(kb, optr);
@@ -311,33 +343,9 @@ static const Node* process_instruction(Context* ctx, KnowledgeBase* kb, const No
311343
}
312344
case load_op: {
313345
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;
341349
// const Node* other_ptr = get_known_address(&ctx->rewriter, ok);
342350
// if (other_ptr && optr != other_ptr) {
343351
// return prim_op_helper(a, load_op, empty(a), singleton(other_ptr));

0 commit comments

Comments
 (0)