PIPS
if_conversion.c File Reference
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "genC.h"
#include "linear.h"
#include "ri.h"
#include "effects.h"
#include "ri-util.h"
#include "prettyprint.h"
#include "effects-util.h"
#include "text-util.h"
#include "database.h"
#include "misc.h"
#include "pipsdbm.h"
#include "resources.h"
#include "control.h"
#include "transformations.h"
#include "effects-generic.h"
#include "effects-simple.h"
#include "properties.h"
#include "callgraph.h"
#include "sac.h"
+ Include dependency graph for if_conversion.c:

Go to the source code of this file.

Functions

static instruction make_phi_assign_instruction (reference lRef, expression cond, expression ref1, expression ref2)
 creates a phi-instruction using the entity given in property the generated instruction as the form lRef = PHI(cond,ref1, ref2) all parameters are copied More...
 
static bool simd_supported_stat_p (statement stat)
 
static bool process_true_call_stat (expression cond, statement stat)
 converts statement stat into a phi-statement if possible More...
 
static void process_true_stat (statement parent, expression cond, statement stat)
 
static void if_conv_statement (statement cs)
 
bool if_conversion (char *mod_name)
 if_conversion.c More...
 
static statement do_loop_nest_unswitching_purge (statement adam, list conditions)
 
static void do_loop_nest_unswitching (statement st, list *conditions)
 
bool loop_nest_unswitching (const char *module_name)
 

Function Documentation

◆ do_loop_nest_unswitching()

static void do_loop_nest_unswitching ( statement  st,
list conditions 
)
static

will help for partial eval later

some conditions left

parent is a loop : check for a conflict

Definition at line 329 of file if_conversion.c.

329  {
330  if(statement_loop_p(st)) {
331  loop l =statement_loop(st);
332  range r = loop_range(l);
333  expression u = range_upper(r);
334  if(expression_minmax_p(u)) {//only handle the case of two args right now ... */
335  call c = expression_call(u);
336  if(gen_length(call_arguments(c)) > 2 ) pips_internal_error("do not handle more than 2 args");
337  expression hs[]= {
338  binary_call_lhs(c),
339  binary_call_rhs(c)
340  };
341  for(int i=0;i<(int)(sizeof(hs)/sizeof(hs[0]));i++) {
342  expression hss = hs[i];
343  hs[i]=copy_expression(hs[i]);
344  NORMALIZE_EXPRESSION(hs[i]);
346  /* will help for partial eval later */
349  hs[i]=make_assign_expression(entity_to_expression(etmp),hs[i]);
351  }
352  }
353 
354  *conditions=
357  *conditions);
358  }
359 
361  /* some conditions left */
362  if(!ENDP(*conditions) && (!statement_loop_p(sparent) || !sparent)) {
363  *st = *(do_loop_nest_unswitching_purge(st,*conditions));
364  //add_pragma_str_to_statement(st,get_string_property("OUTLINE_PRAGMA"),true);
365  gen_full_free_list(*conditions);
366  *conditions=NIL;
367  }
368  /* parent is a loop : check for a conflict */
369  else {
370  list toremove=NIL;
371  list tconditions=gen_copy_seq(*conditions);
372  FOREACH(EXPRESSION,cond,tconditions) {
373  set s = get_referenced_entities(cond);
374  if(set_belong_p(s,loop_index(statement_loop(sparent)))) {
375  toremove=CONS(EXPRESSION,cond,toremove);
376  gen_remove_once(conditions,cond);
377  }
378  set_free(s);
379  }
380  gen_free_list(tconditions);
381  if(!ENDP(toremove)) {
382  *st = *(do_loop_nest_unswitching_purge(st,toremove));
383  //add_pragma_str_to_statement(st,get_string_property("OUTLINE_PRAGMA"),true);
384  }
385  gen_full_free_list(toremove);
386  }
387  }
388  else pips_assert("everything is ok",ENDP(*conditions));
389 }
expression copy_expression(expression p)
EXPRESSION.
Definition: ri.c:850
void const char const char const int
struct _newgen_struct_statement_ * statement
Definition: cloning.h:21
void gen_full_free_list(list l)
Definition: genClib.c:1023
entity get_current_module_entity(void)
Get the entity of the current module.
Definition: static.c:85
gen_chunk * gen_get_ancestor(int, const void *)
return the first ancestor object found of the given type.
Definition: genClib.c:3560
#define ENDP(l)
Test if a list is empty.
Definition: newgen_list.h:66
void gen_remove_once(list *pl, const void *o)
Remove the first occurence of o in list pl:
Definition: list.c:691
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
list gen_copy_seq(list l)
Copy a list structure.
Definition: list.c:501
size_t gen_length(const list l)
Definition: list.c:150
#define CONS(_t_, _i_, _l_)
List element cell constructor (insert an element at the beginning of a list)
Definition: newgen_list.h:150
void gen_free_list(list l)
free the spine of the list
Definition: list.c:327
#define FOREACH(_fe_CASTER, _fe_item, _fe_list)
Apply/map an instruction block on all the elements of a list.
Definition: newgen_list.h:179
loop statement_loop(statement)
Get the loop of a statement.
Definition: statement.c:1374
bool statement_loop_p(statement)
Definition: statement.c:349
static statement do_loop_nest_unswitching_purge(statement adam, list conditions)
#define pips_assert(what, predicate)
common macros, two flavors depending on NDEBUG
Definition: misc-local.h:172
#define pips_internal_error
Definition: misc-local.h:149
void set_free(set)
Definition: set.c:332
bool set_belong_p(const set, const void *)
Definition: set.c:194
#define GREATER_THAN_OPERATOR_NAME
#define binary_call_rhs(c)
#define NORMALIZE_EXPRESSION(e)
#define binary_intrinsic_expression(name, e1, e2)
#define binary_call_lhs(c)
set get_referenced_entities(void *elem)
retrieves the set of entities used in elem beware that this entities may be formal parameters,...
Definition: entity.c:3063
bool expression_minmax_p(expression e)
Definition: expression.c:3882
expression entity_to_expression(entity e)
if v is a constant, returns a constant call.
Definition: expression.c:165
call expression_call(expression e)
Definition: expression.c:445
void update_expression_syntax(expression e, syntax s)
frees expression syntax of e and replace it by the new syntax s
Definition: expression.c:3564
expression make_assign_expression(expression lhs, expression rhs)
Make an assign expression, since in C the assignment is a side effect operator.
Definition: expression.c:390
basic basic_of_expression(expression)
basic basic_of_expression(expression exp): Makes a basic of the same basic as the expression "exp".
Definition: type.c:1383
entity make_new_scalar_variable(entity, basic)
Definition: variable.c:741
void AddEntityToCurrentModule(entity)
Add a variable entity to the current module declarations.
Definition: variable.c:260
#define normalized_complex_p(x)
Definition: ri.h:1782
#define range_upper(x)
Definition: ri.h:2290
#define statement_domain
newgen_sizeofexpression_domain_defined
Definition: ri.h:362
#define EXPRESSION(x)
EXPRESSION.
Definition: ri.h:1217
#define expression_normalized(x)
Definition: ri.h:1249
#define loop_range(x)
Definition: ri.h:1642
#define call_arguments(x)
Definition: ri.h:711
#define expression_syntax(x)
Definition: ri.h:1247
#define loop_index(x)
Definition: ri.h:1640
FI: I do not understand why the type is duplicated at the set level.
Definition: set.c:59
The structure used to build lists in NewGen.
Definition: newgen_list.h:41

References AddEntityToCurrentModule(), basic_of_expression(), binary_call_lhs, binary_call_rhs, binary_intrinsic_expression, call_arguments, CONS, copy_expression(), do_loop_nest_unswitching_purge(), ENDP, entity_to_expression(), EXPRESSION, expression_call(), expression_minmax_p(), expression_normalized, expression_syntax, FOREACH, gen_copy_seq(), gen_free_list(), gen_full_free_list(), gen_get_ancestor(), gen_length(), gen_remove_once(), get_current_module_entity(), get_referenced_entities(), GREATER_THAN_OPERATOR_NAME, int, loop_index, loop_range, make_assign_expression(), make_new_scalar_variable(), NIL, NORMALIZE_EXPRESSION, normalized_complex_p, pips_assert, pips_internal_error, range_upper, set_belong_p(), set_free(), statement_domain, statement_loop(), statement_loop_p(), and update_expression_syntax().

Referenced by loop_nest_unswitching().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ do_loop_nest_unswitching_purge()

static statement do_loop_nest_unswitching_purge ( statement  adam,
list  conditions 
)
static

Definition at line 310 of file if_conversion.c.

310  {
311  if(ENDP(conditions)) {
313  statement eve = clone_statement(adam,cc);
314  free_clone_context(cc);
315  return eve;
316  }
319  make_test(
320  copy_expression(EXPRESSION(CAR(conditions))),
321  do_loop_nest_unswitching_purge(adam,CDR(conditions)),
322  do_loop_nest_unswitching_purge(adam,CDR(conditions))
323  )
324  )
325  );
326  return eve;
327 }
clone_context make_clone_context(entity a1, entity a2, list a3, statement a4)
Definition: cloning.c:52
void free_clone_context(clone_context p)
Definition: cloning.c:19
test make_test(expression a1, statement a2, statement a3)
Definition: ri.c:2607
instruction make_instruction_test(test _field_)
Definition: ri.c:1172
statement clone_statement(statement s, clone_context cc)
clone_statement.c
statement instruction_to_statement(instruction)
Build a statement from a give instruction.
Definition: statement.c:597
statement get_current_module_statement(void)
Get the current module statement.
Definition: static.c:208
#define CAR(pcons)
Get the value of the first element of a list.
Definition: newgen_list.h:92
#define CDR(pcons)
Get the list less its first element.
Definition: newgen_list.h:111

References CAR, CDR, clone_statement(), copy_expression(), ENDP, EXPRESSION, free_clone_context(), get_current_module_entity(), get_current_module_statement(), instruction_to_statement(), make_clone_context(), make_instruction_test(), make_test(), and NIL.

Referenced by do_loop_nest_unswitching().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ if_conv_statement()

static void if_conv_statement ( statement  cs)
static

Definition at line 244 of file if_conversion.c.

245 {
246  // If the statement comment contains the string IF_TO_CONVERT,
247  // then it means that this statement must be converted ...
248  extension ex;
250  {
251  // remove the pragma
253 
254  // Process the "true statements" (test_false(t) is empty because if_conversion
255  // phase is done after if_conversion_init phase).
258  }
259 }
void gen_remove(list *cpp, const void *o)
remove all occurences of item o from list *cpp, which is thus modified.
Definition: list.c:685
extension get_extension_from_statement_with_pragma(statement, const char *)
Get the extension of a statement with pragma beginning with a prefix.
Definition: statement.c:3871
static void process_true_stat(statement parent, expression cond, statement stat)
#define test_true(x)
Definition: ri.h:2835
#define statement_extensions(x)
Definition: ri.h:2464
#define test_condition(x)
Definition: ri.h:2833
#define statement_instruction(x)
Definition: ri.h:2458
#define extensions_extension(x)
Definition: ri.h:1330
#define instruction_test(x)
Definition: ri.h:1517
#define IF_TO_CONVERT
if conversion
Definition: sac-local.h:43

References extensions_extension, gen_remove(), get_extension_from_statement_with_pragma(), IF_TO_CONVERT, instruction_test, process_true_stat(), statement_extensions, statement_instruction, test_condition, and test_true.

Referenced by if_conversion().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ if_conversion()

bool if_conversion ( char *  mod_name)

if_conversion.c

Parameters
mod_nameod_name

Definition at line 281 of file if_conversion.c.

282 {
283  // get the resources
284  statement mod_stmt = (statement)
285  db_get_memory_resource(DBR_CODE, mod_name, true);
286 
289 
290  debug_on("IF_CONVERSION_DEBUG_LEVEL");
291  // Now do the job
292 
294 
295  // Reorder the module, because new statements have been added
296  module_reorder(mod_stmt);
297  DB_PUT_MEMORY_RESOURCE(DBR_CODE, mod_name, mod_stmt);
298  DB_PUT_MEMORY_RESOURCE(DBR_CALLEES, mod_name,
299  compute_callees(mod_stmt));
300 
301  // update/release resources
304 
305  debug_off();
306 
307  return true;
308 }
callees compute_callees(const statement stat)
Recompute the callees of a module statement.
Definition: callgraph.c:355
#define gen_recurse(start, domain_number, flt, rwt)
Definition: genC.h:283
void reset_current_module_entity(void)
Reset the current module entity.
Definition: static.c:97
void reset_current_module_statement(void)
Reset the current module statement.
Definition: static.c:221
statement set_current_module_statement(statement)
Set the current module statement.
Definition: static.c:165
entity set_current_module_entity(entity)
static.c
Definition: static.c:66
bool gen_true(__attribute__((unused)) gen_chunk *unused)
Return true and ignore the argument.
Definition: genClib.c:2780
string db_get_memory_resource(const char *rname, const char *oname, bool pure)
Return the pointer to the resource, whatever it is.
Definition: database.c:755
#define DB_PUT_MEMORY_RESOURCE(res_name, own_name, res_val)
conform to old interface.
Definition: pipsdbm-local.h:66
static void if_conv_statement(statement cs)
#define debug_on(env)
Definition: misc-local.h:157
#define debug_off()
Definition: misc-local.h:160
bool module_reorder(statement body)
Reorder a module and recompute order to statement if any.
Definition: reorder.c:244
entity module_name_to_entity(const char *mn)
This is an alias for local_name_to_top_level_entity.
Definition: entity.c:1479

References compute_callees(), db_get_memory_resource(), DB_PUT_MEMORY_RESOURCE, debug_off, debug_on, gen_recurse, gen_true(), if_conv_statement(), module_name_to_entity(), module_reorder(), reset_current_module_entity(), reset_current_module_statement(), set_current_module_entity(), set_current_module_statement(), and statement_domain.

+ Here is the call graph for this function:

◆ loop_nest_unswitching()

bool loop_nest_unswitching ( const char *  module_name)
Parameters
module_nameodule_name

Definition at line 391 of file if_conversion.c.

391  {
394 
395  list l=NIL;
398  pips_assert("everything went well\n",ENDP(l));
399 
400 
401  // Reorder the module, because new statements have been added
404 
407  return true;
408 }
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
#define gen_context_recurse(start, ctxt, domain_number, flt, rwt)
Definition: genC.h:285
bool gen_true2(__attribute__((unused)) gen_chunk *u1, __attribute__((unused)) void *u2)
Definition: genClib.c:2785
static void do_loop_nest_unswitching(statement st, list *conditions)

References db_get_memory_resource(), DB_PUT_MEMORY_RESOURCE, do_loop_nest_unswitching(), ENDP, gen_context_recurse, gen_true2(), get_current_module_statement(), module_name(), module_name_to_entity(), module_reorder(), NIL, pips_assert, reset_current_module_entity(), reset_current_module_statement(), set_current_module_entity(), set_current_module_statement(), and statement_domain.

+ Here is the call graph for this function:

◆ make_phi_assign_instruction()

static instruction make_phi_assign_instruction ( reference  lRef,
expression  cond,
expression  ref1,
expression  ref2 
)
static

creates a phi-instruction using the entity given in property the generated instruction as the form lRef = PHI(cond,ref1, ref2) all parameters are copied

Definition at line 64 of file if_conversion.c.

66 {
67  entity phiEntity = module_name_to_runtime_entity(get_string_property("IF_CONVERSION_PHI"));
68  expression phiExp = MakeTernaryCall(
69  phiEntity,
70  copy_expression(cond),
71  copy_expression(ref1),
72  copy_expression(ref2)
73  );
74 
76 }
reference copy_reference(reference p)
REFERENCE.
Definition: ri.c:2047
char * get_string_property(const char *)
instruction make_assign_instruction(expression l, expression r)
Definition: instruction.c:87
entity module_name_to_runtime_entity(const char *name)
similar to module_name_to_entity but generates a warning and a stub if the entity is not found
Definition: entity.c:1485
expression reference_to_expression(reference r)
Definition: expression.c:196
expression MakeTernaryCall(entity f, expression e1, expression e2, expression e3)
Creates a call expression to a function with 3 arguments.
Definition: expression.c:367

References copy_expression(), copy_reference(), get_string_property(), make_assign_instruction(), MakeTernaryCall(), module_name_to_runtime_entity(), and reference_to_expression().

Referenced by process_true_call_stat().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ process_true_call_stat()

static bool process_true_call_stat ( expression  cond,
statement  stat 
)
static

converts statement stat into a phi-statement if possible

Parameters
condcondition of the potential new phi - statement
statstatement to check
Returns
true if processing was ok (sg:unclean, event to me :))

to prevent side effect from further inplace modification

Definition at line 113 of file if_conversion.c.

114 {
115 
116  // Only the assign statements with no side effects are supported
117  if(simd_supported_stat_p(stat))
118  {
120 
121  // lRef is the left reference of the assign call
122  expression lhs = binary_call_lhs(c);
123  reference lhs_ref = expression_reference(lhs);
124  lhs=copy_expression(lhs); /* to prevent side effect from further inplace modification */
125  entity e = reference_variable(lhs_ref);
126 
127  basic newBas = basic_of_reference(lhs_ref);
128 
129  if(!basic_undefined_p(newBas))
130  {
131  ifdebug(1) {
132  pips_debug(1,"converting statement\n");
133  print_statement(stat);
134  }
135  // Create a new entity if rhs is not a reference or a constant itself
136  expression rhs = binary_call_rhs(c);
140  ref = rhs;
141  else {
144  newBas);
145  AddEntityToCurrentModule(newVar);
146 
149  to_add = call_to_statement(c);
150  }
151  // Make an assign statement to insert before the phi-statement
152  instruction assign = make_phi_assign_instruction(lhs_ref, cond, ref, lhs);
153  update_statement_instruction(stat,assign);
154  if(!statement_undefined_p(to_add))
155  insert_statement(stat,to_add,true);
156  ifdebug(1) {
157  pips_debug(1,"into statement\n");
158  print_statement(stat);
159  }
160  free_expression(lhs);
161  return true;
162  }
163  free_expression(lhs);
164 
165  }
166  else if(declaration_statement_p(stat))
167  return true;// leave statement untouched
168  return false;
169 }
reference make_reference(entity a1, list a2)
Definition: ri.c:2083
call copy_call(call p)
CALL.
Definition: ri.c:233
void free_expression(expression p)
Definition: ri.c:853
static reference ref
Current stmt (an integer)
Definition: adg_read_paf.c:163
statement update_statement_instruction(statement, instruction)
Replace the instruction in statement s by instruction i.
Definition: statement.c:3039
void insert_statement(statement, statement, bool)
This is the normal entry point.
Definition: statement.c:2570
bool declaration_statement_p(statement)
Had to be optimized according to Beatrice Creusillet.
Definition: statement.c:224
bool expression_constant_p(expression)
HPFC module by Fabien COELHO.
Definition: expression.c:2453
static instruction make_phi_assign_instruction(reference lRef, expression cond, expression ref1, expression ref2)
creates a phi-instruction using the entity given in property the generated instruction as the form lR...
Definition: if_conversion.c:64
static bool simd_supported_stat_p(statement stat)
Definition: if_conversion.c:84
#define pips_debug
these macros use the GNU extensions that allow variadic macros, including with an empty list.
Definition: misc-local.h:145
void print_statement(statement)
Print a statement on stderr.
Definition: statement.c:98
#define call_to_statement(c)
const char * entity_local_name(entity e)
entity_local_name modified so that it does not core when used in vect_fprint, since someone thought t...
Definition: entity.c:453
bool expression_reference_p(expression e)
Test if an expression is a reference.
Definition: expression.c:528
reference expression_reference(expression e)
Short cut, meaningful only if expression_reference_p(e) holds.
Definition: expression.c:1832
entity make_new_scalar_variable_with_prefix(const char *, entity, basic)
Create a new scalar variable of type b in the given module.
Definition: variable.c:592
basic basic_of_reference(reference)
Retrieves the basic of a reference in a newly allocated basic object.
Definition: type.c:1459
#define syntax_reference(x)
Definition: ri.h:2730
#define reference_variable(x)
Definition: ri.h:2326
#define basic_undefined_p(x)
Definition: ri.h:557
#define expression_undefined
Definition: ri.h:1223
#define instruction_call(x)
Definition: ri.h:1529
#define statement_undefined_p(x)
Definition: ri.h:2420
#define statement_undefined
Definition: ri.h:2419
#define ifdebug(n)
Definition: sg.c:47

References AddEntityToCurrentModule(), basic_of_reference(), basic_undefined_p, binary_call_lhs, binary_call_rhs, call_to_statement, copy_call(), copy_expression(), declaration_statement_p(), entity_local_name(), expression_constant_p(), expression_reference(), expression_reference_p(), expression_syntax, expression_undefined, free_expression(), get_current_module_entity(), ifdebug, insert_statement(), instruction_call, make_new_scalar_variable_with_prefix(), make_phi_assign_instruction(), make_reference(), NIL, pips_debug, print_statement(), ref, reference_to_expression(), reference_variable, simd_supported_stat_p(), statement_instruction, statement_undefined, statement_undefined_p, syntax_reference, and update_statement_instruction().

Referenced by process_true_stat().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ process_true_stat()

static void process_true_stat ( statement  parent,
expression  cond,
statement  stat 
)
static

Definition at line 189 of file if_conversion.c.

190 {
191 
192  // It must have been verified in the if_conversion_init phase
193  pips_assert("stat is a call or a sequence statement",
196  statement_loop_p(stat)));
197 
198  // If stat is a call statement, ...
200  {
201  if(process_true_call_stat(cond, stat))
202  {
206  free_statement(stat);
207  }
208 
209  }
210  // recurse for for loops
211  else if( statement_loop_p(stat))
212  process_true_stat(stat,cond,loop_body(statement_loop(stat)));
213 
214  // If stat is a sequence statement, ...
215  else if(statement_block_p(stat))
216  {
217  // first split initalizations
219 
220  // then do the processing
221  bool something_bad_p=false;
222  if(statement_block_p(stat))
223  {
225  {
226  something_bad_p|=!process_true_call_stat(cond, st);
227  }
228  }
229  else
230  something_bad_p|=!process_true_call_stat(cond, stat);
231  if(!something_bad_p)
232  {
236  free_statement(stat);
237  }
238  }
239 }
void free_statement(statement p)
Definition: ri.c:2189
void statement_split_initializations(statement s)
Recurse through the statements of s and split local declarations.
Definition: flatten_code.c:733
list statement_block(statement)
Get the list of block statements of a statement sequence.
Definition: statement.c:1338
static bool process_true_call_stat(expression cond, statement stat)
converts statement stat into a phi-statement if possible
#define statement_block_p(stat)
#define loop_body(x)
Definition: ri.h:1644
#define instruction_sequence_p(x)
Definition: ri.h:1512
#define instruction_undefined
Definition: ri.h:1454
#define instruction_call_p(x)
Definition: ri.h:1527
#define STATEMENT(x)
STATEMENT.
Definition: ri.h:2413

References FOREACH, free_statement(), instruction_call_p, instruction_sequence_p, instruction_undefined, loop_body, pips_assert, process_true_call_stat(), STATEMENT, statement_block(), statement_block_p, statement_instruction, statement_loop(), statement_loop_p(), statement_split_initializations(), and update_statement_instruction().

Referenced by if_conv_statement().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ simd_supported_stat_p()

static bool simd_supported_stat_p ( statement  stat)
static

Definition at line 84 of file if_conversion.c.

85 {
87  {
89  split_update_call(c); // this will take car of splitting a+=2 into a = a+2
90  entity op = call_function(c);
91  // Only the assign statements with no side effects are supported
92  if(ENTITY_ASSIGN_P(op) )
93  {
96  bool has_write_effect_p = effects_write_at_least_once_p(effects);
97  free(effects);
98  return !has_write_effect_p;
99  }
100  }
101  return false;
102 }
bool effects_write_at_least_once_p(list)
list expression_to_proper_effects(expression)
void split_update_call(call c)
Definition: flatten_code.c:772
void free(void *)
#define ENTITY_ASSIGN_P(e)
#define call_function(x)
Definition: ri.h:709

References call_arguments, call_function, CAR, CDR, effects_write_at_least_once_p(), ENTITY_ASSIGN_P, EXPRESSION, expression_to_proper_effects(), free(), instruction_call, instruction_call_p, split_update_call(), and statement_instruction.

Referenced by process_true_call_stat().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: