PIPS
simplify.c File Reference
#include "genC.h"
#include "linear.h"
#include "ri.h"
#include "effects.h"
#include "ri-util.h"
#include "effects-util.h"
#include "misc.h"
#include "pipsdbm.h"
#include "resources.h"
#include "control.h"
#include "properties.h"
#include "expressions.h"
+ Include dependency graph for simplify.c:

Go to the source code of this file.

Data Structures

struct  entity_used_in_calls_p
 
struct  rfr_param
 
struct  dssrhp
 

Functions

static bool has_address_of_operator_walker_p (call c, bool *panswer)
 
static bool has_address_of_operator_p (expression exp)
 look for an & in the expression More...
 
static void simplify_subscript (subscript ss)
 the walker More...
 
static void do_simplify_subscripts (statement s)
 
bool simplify_subscripts (const char *module_name)
 atomize subscript expressions so that thay can be reprsetned as references More...
 
static void entity_used_in_calls_walker (call c, entity_used_in_calls_p *p)
 
static bool entity_used_in_calls (entity e)
 
static void replace_field_by_reference_walker (call c, rfr_param *p)
 
static void replace_field_by_reference (entity structure, entity field, entity new)
 
static instruction make_fields_assignment_instruction (entity var, list fields, list new_vars)
 
static void do_split_structure_return_hook_walker (statement s, dssrhp *p)
 
static void do_split_structure_return_hook (entity var, list fields, list new_vars)
 
static list do_split_structure (entity e, statement s)
 
static void do_split_structures (statement s)
 
static void do_split_structure_parameter (entity e)
 
bool split_structures (const char *module_name)
 
expression make_float_constant_expression (float)
 
static void set_the_i ()
 
static void reset_the_i ()
 
void complex_translation_array_of_structs (list *pl, list l)
 
void complex_translation_struct_of_array (list *pl, list l)
 
static void set_translation_mode ()
 
static void reset_translation_mode ()
 
static void simplify_complex_entity (entity c)
 adds a dimension to all entity whose basic is complex , and change their basic to float More...
 
static void simplify_complex_declaration (entity e)
 
static expression split_complex_expression (expression e)
 
static bool simplify_complex_expression (expression e)
 
static void simplify_complex_statements (statement s)
 
bool simplify_complex (const char *module_name)
 split complexes into an array with first element <> real part and second element <> imaginary part More...
 
static void do_simplify_c_operator (call c)
 
void simplify_c_operator (statement s)
 replace PLUS_C_OPERATOR_NAME by PLUS_OPERATOR_NAME when relevant More...
 
static void do_simplify_constant_address_expression (expression exp)
 perform constant string dereferencing evaluation More...
 
static void do_simplify_constant_address_expression_in_decl (statement st)
 forward processing through declarations More...
 
bool simplify_constant_address_expressions (const char *module_name)
 transforms *"aer" into 'a' do not take care of "aer"[2] but could be extended to More...
 

Variables

static entity THE_I = entity_undefined
 
static void(* complex_translation )(list *, list) =NULL
 

Function Documentation

◆ complex_translation_array_of_structs()

void complex_translation_array_of_structs ( list pl,
list  l 
)
Parameters
pll

Definition at line 412 of file simplify.c.

413 {
414  gen_append(*pl,l);
415 }
list gen_append(list l1, const list l2)
Definition: list.c:471
static hash_table pl
properties are stored in this hash table (string -> property) for fast accesses.
Definition: properties.c:783

References gen_append(), and pl.

Referenced by set_translation_mode().

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

◆ complex_translation_struct_of_array()

void complex_translation_struct_of_array ( list pl,
list  l 
)
Parameters
pll

Definition at line 416 of file simplify.c.

417 {
418  gen_append(l,*pl);
419  *pl=l;
420 }

References gen_append(), and pl.

Referenced by set_translation_mode().

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

◆ do_simplify_c_operator()

static void do_simplify_c_operator ( call  c)
static

Definition at line 604 of file simplify.c.

605 {
606  entity op =call_function(c);
607  if(ENTITY_PLUS_C_P(op)||ENTITY_MINUS_C_P(op)) {
608  expression lhs = binary_call_lhs(c);
609  expression rhs = binary_call_rhs(c);
610  basic blhs = basic_of_expression(lhs);
611  basic brhs = basic_of_expression(rhs);
612  if(!basic_pointer_p(blhs) && ! basic_pointer_p(brhs))
615  free_basic(blhs);
616  free_basic(brhs);
617  }
618 }
void free_basic(basic p)
Definition: ri.c:107
#define binary_call_rhs(c)
#define MINUS_OPERATOR_NAME
#define PLUS_OPERATOR_NAME
#define ENTITY_PLUS_C_P(e)
#define ENTITY_MINUS_C_P(e)
#define binary_call_lhs(c)
entity entity_intrinsic(const char *name)
FI: I do not understand this function name (see next one!).
Definition: entity.c:1292
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
#define call_function(x)
Definition: ri.h:709
#define basic_pointer_p(x)
Definition: ri.h:635

References basic_of_expression(), basic_pointer_p, binary_call_lhs, binary_call_rhs, call_function, entity_intrinsic(), ENTITY_MINUS_C_P, ENTITY_PLUS_C_P, free_basic(), MINUS_OPERATOR_NAME, and PLUS_OPERATOR_NAME.

Referenced by simplify_c_operator().

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

◆ do_simplify_constant_address_expression()

static void do_simplify_constant_address_expression ( expression  exp)
static

perform constant string dereferencing evaluation

Definition at line 626 of file simplify.c.

626  {
627  if(expression_call_p(exp)) {
629  entity operator = call_function(c);
630  list args = call_arguments(c);
631  if(ENTITY_DEREFERENCING_P(operator)) {
632  expression arg = EXPRESSION(CAR(args));
634  char * string_constant = expression_string_constant(arg);
635  char buf[] = { '\'', *string_constant, '\'', 0 };
636  expression character_constant = MakeCharacterConstantExpression(strdup(buf));
637  update_expression_syntax(exp,expression_syntax(character_constant));
638  expression_syntax(character_constant)=syntax_undefined;
639  free(string_constant);
640  free_expression(character_constant);
641  }
642  }
643  }
644 }
void free_expression(expression p)
Definition: ri.c:853
expression MakeCharacterConstantExpression(string s)
END_EOLE.
Definition: constant.c:573
void free(void *)
#define CAR(pcons)
Get the value of the first element of a list.
Definition: newgen_list.h:92
#define ENTITY_DEREFERENCING_P(e)
bool expression_call_p(expression e)
Definition: expression.c:415
bool expression_string_constant_p(expression exp)
Definition: expression.c:2398
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
char * expression_string_constant(expression exp)
returns a newly allocated string!
Definition: expression.c:2409
#define EXPRESSION(x)
EXPRESSION.
Definition: ri.h:1217
#define syntax_undefined
Definition: ri.h:2676
#define call_arguments(x)
Definition: ri.h:711
#define expression_syntax(x)
Definition: ri.h:1247
char * strdup()
static char buf[BSZ]
Definition: split_file.c:157
The structure used to build lists in NewGen.
Definition: newgen_list.h:41
#define exp
Avoid some warnings from "gcc -Wshadow".
Definition: vasnprintf.c:207

References buf, call_arguments, call_function, CAR, ENTITY_DEREFERENCING_P, exp, EXPRESSION, expression_call(), expression_call_p(), expression_string_constant(), expression_string_constant_p(), expression_syntax, free(), free_expression(), MakeCharacterConstantExpression(), strdup(), syntax_undefined, and update_expression_syntax().

Referenced by do_simplify_constant_address_expression_in_decl(), and simplify_constant_address_expressions().

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

◆ do_simplify_constant_address_expression_in_decl()

static void do_simplify_constant_address_expression_in_decl ( statement  st)
static

forward processing through declarations

Definition at line 647 of file simplify.c.

647  {
648  if(declaration_statement_p(st)) {
651  }
652 }
#define gen_recurse(start, domain_number, flt, rwt)
Definition: genC.h:283
bool gen_true(__attribute__((unused)) gen_chunk *unused)
Return true and ignore the argument.
Definition: genClib.c:2780
#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
bool declaration_statement_p(statement)
Had to be optimized according to Beatrice Creusillet.
Definition: statement.c:224
#define expression_domain
newgen_execution_domain_defined
Definition: ri.h:154
#define ENTITY(x)
ENTITY.
Definition: ri.h:2755
#define statement_declarations(x)
Definition: ri.h:2460
#define entity_initial(x)
Definition: ri.h:2796
static void do_simplify_constant_address_expression(expression exp)
perform constant string dereferencing evaluation
Definition: simplify.c:626

References declaration_statement_p(), do_simplify_constant_address_expression(), ENTITY, entity_initial, expression_domain, FOREACH, gen_recurse, gen_true(), and statement_declarations.

Referenced by simplify_constant_address_expressions().

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

◆ do_simplify_subscripts()

static void do_simplify_subscripts ( statement  s)
static

Definition at line 57 of file simplify.c.

57  {
58  gen_recurse(s,
61 }
bool statement_consistent_p(statement p)
Definition: ri.c:2195
#define subscript_domain
newgen_storage_domain_defined
Definition: ri.h:378
static void simplify_subscript(subscript ss)
the walker
Definition: simplify.c:32

References gen_recurse, gen_true(), simplify_subscript(), statement_consistent_p(), and subscript_domain.

Referenced by simplify_subscripts().

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

◆ do_split_structure()

static list do_split_structure ( entity  e,
statement  s 
)
static

we copied the field storage, that is rom, recompute a ram storage

then take car of initial value if any

hook: handle returns as a special case

Definition at line 256 of file simplify.c.

257 {
258  list added = NIL;
259  if(entity_variable_p(e) )
260  {
264  {
265  list fields = type_struct_variable_p(t)?
270  NIL;
271  FOREACH(ENTITY,f,fields)
272  {
274  string new_name = strdup(entity_name(f));
275  for(string found = strchr(new_name,MEMBER_SEP_CHAR);found;found = strchr(new_name,MEMBER_SEP_CHAR))
276  *found='_';
277  entity new = make_entity_copy_with_new_name(f,new_name,false);
278  free(new_name);
279  /* we copied the field storage, that is rom, recompute a ram storage */
282  entity_storage(new) =
285  (basic_overloaded_p(entity_basic(new))?0:add_variable_to_area(dyn_area,new)),
286  NIL));
287  /* then take car of initial value if any */
288  if(formal_parameter_p(e))
289  {
290  if(entity_scalar_p(new))
291  entity_initial(new)=
297  )
298  );
299  else
310  )
311  )
312  ),
313  true
314  );
315  }
316  else
321  added=CONS(ENTITY,new,added);
322  if(!ENDP(inits)) POP(inits);
323  }
324  added=gen_nreverse(added);
326  {
329  }
330  /* hook: handle returns as a special case */
331  do_split_structure_return_hook(e,fields,added);
332  }
333  }
334  return added;
335 }
value make_value_unknown(void)
Definition: ri.c:2847
value make_value_expression(expression _field_)
Definition: ri.c:2850
sizeofexpression make_sizeofexpression_expression(expression _field_)
Definition: ri.c:2180
expression make_expression(syntax a1, normalized a2)
Definition: ri.c:886
syntax make_syntax_sizeofexpression(sizeofexpression _field_)
Definition: ri.c:2506
ram make_ram(entity a1, entity a2, intptr_t a3, list a4)
Definition: ri.c:1999
expression copy_expression(expression p)
EXPRESSION.
Definition: ri.c:850
void free_storage(storage p)
Definition: ri.c:2231
storage make_storage_ram(ram _field_)
Definition: ri.c:2279
void free_value(value p)
Definition: ri.c:2787
statement instruction_to_statement(instruction)
Build a statement from a give instruction.
Definition: statement.c:597
const char * get_current_module_name(void)
Get the name of the current module.
Definition: static.c:121
entity get_current_module_entity(void)
Get the entity of the current module.
Definition: static.c:85
instruction make_call_instruction(entity e, list l)
Build an instruction that call a function entity with an argument list.
Definition: instruction.c:51
#define ENDP(l)
Test if a list is empty.
Definition: newgen_list.h:66
list gen_nreverse(list cp)
reverse a list in place
Definition: list.c:304
#define POP(l)
Modify a list pointer to point on the next element of the list.
Definition: newgen_list.h:59
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
#define CONS(_t_, _i_, _l_)
List element cell constructor (insert an element at the beginning of a list)
Definition: newgen_list.h:150
void insert_statement(statement, statement, bool)
This is the normal entry point.
Definition: statement.c:2570
#define DYNAMIC_AREA_LOCAL_NAME
Definition: naming-local.h:69
#define MEMBER_SEP_CHAR
Definition: naming-local.h:54
int f(int off1, int off2, int n, float r[n], float a[n], float b[n])
Definition: offsets.c:15
#define make_expression_list(stats...)
#define POINT_TO_OPERATOR_NAME
Definition: ri-util-local.h:92
#define FIELD_OPERATOR_NAME
Definition: ri-util-local.h:91
#define MEMCPY_FUNCTION_NAME
include <string.h>
#define entity_variable_p(e)
An entity_variable_p(e) may hide a typedef and hence a functional type.
entity FindEntity(const char *package, const char *name)
Retrieve an entity from its package/module name and its local name.
Definition: entity.c:1503
basic entity_basic(entity e)
return the basic associated to entity e if it's a function/variable/constant basic_undefined otherwis...
Definition: entity.c:1380
static int init
Maximal value set for Fortran 77.
Definition: entity.c:320
entity make_entity_copy_with_new_name(entity e, string global_new_name, bool move_initialization_p)
Create a copy of an entity, with (almost) identical type, storage and initial value if move_initializ...
Definition: entity.c:2463
expression entity_to_expression(entity e)
if v is a constant, returns a constant call.
Definition: expression.c:165
expression MakeBinaryCall(entity f, expression eg, expression ed)
Creates a call expression to a function with 2 arguments.
Definition: expression.c:354
type ultimate_type(type)
Definition: type.c:3466
bool entity_scalar_p(entity)
The concrete type of e is a scalar type.
Definition: variable.c:1113
bool formal_parameter_p(entity)
Definition: variable.c:1489
int add_variable_to_area(entity, entity)
Definition: variable.c:1376
bool type_struct_variable_p(type)
Definition: type.c:3867
bool type_pointer_on_struct_variable_p(type)
Definition: type.c:2960
#define type_struct(x)
Definition: ri.h:2964
#define basic_pointer(x)
Definition: ri.h:637
#define normalized_undefined
Definition: ri.h:1745
#define basic_derived(x)
Definition: ri.h:640
#define type_variable(x)
Definition: ri.h:2949
#define entity_storage(x)
Definition: ri.h:2794
#define basic_overloaded_p(x)
Definition: ri.h:623
#define expression_undefined
Definition: ri.h:1223
#define entity_name(x)
Definition: ri.h:2790
#define expression_undefined_p(x)
Definition: ri.h:1224
#define entity_type(x)
Definition: ri.h:2792
#define value_expression_p(x)
Definition: ri.h:3080
#define value_expression(x)
Definition: ri.h:3082
#define variable_basic(x)
Definition: ri.h:3120
static void do_split_structure_return_hook(entity var, list fields, list new_vars)
Definition: simplify.c:239
static bool entity_used_in_calls(entity e)
Definition: simplify.c:118
static void replace_field_by_reference(entity structure, entity field, entity new)
Definition: simplify.c:161

References add_variable_to_area(), basic_derived, basic_overloaded_p, basic_pointer, call_arguments, CAR, CONS, copy_expression(), do_split_structure_return_hook(), DYNAMIC_AREA_LOCAL_NAME, ENDP, ENTITY, entity_basic(), entity_initial, entity_intrinsic(), entity_name, entity_scalar_p(), entity_storage, entity_to_expression(), entity_type, entity_used_in_calls(), entity_variable_p, EXPRESSION, expression_call(), expression_undefined, expression_undefined_p, f(), FIELD_OPERATOR_NAME, FindEntity(), FOREACH, formal_parameter_p(), free(), free_storage(), free_value(), gen_nreverse(), get_current_module_entity(), get_current_module_name(), init, insert_statement(), instruction_to_statement(), make_call_instruction(), make_entity_copy_with_new_name(), make_expression(), make_expression_list, make_ram(), make_sizeofexpression_expression(), make_storage_ram(), make_syntax_sizeofexpression(), make_value_expression(), make_value_unknown(), MakeBinaryCall(), MEMBER_SEP_CHAR, MEMCPY_FUNCTION_NAME, NIL, normalized_undefined, POINT_TO_OPERATOR_NAME, POP, replace_field_by_reference(), strdup(), type_pointer_on_struct_variable_p(), type_struct, type_struct_variable_p(), type_variable, ultimate_type(), value_expression, value_expression_p, and variable_basic.

Referenced by do_split_structure_parameter(), and do_split_structures().

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

◆ do_split_structure_parameter()

static void do_split_structure_parameter ( entity  e)
static

Definition at line 357 of file simplify.c.

358 {
360  FOREACH(ENTITY,e,added)
362  gen_free_list(added);
363 }
statement get_current_module_statement(void)
Get the current module statement.
Definition: static.c:208
void gen_free_list(list l)
free the spine of the list
Definition: list.c:327
void AddEntityToCurrentModule(entity)
Add a variable entity to the current module declarations.
Definition: variable.c:260
static list do_split_structure(entity e, statement s)
Definition: simplify.c:256

References AddEntityToCurrentModule(), do_split_structure(), ENTITY, FOREACH, gen_free_list(), and get_current_module_statement().

Referenced by split_structures().

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

◆ do_split_structure_return_hook()

static void do_split_structure_return_hook ( entity  var,
list  fields,
list  new_vars 
)
static

also add a 'set all' operation at end ob block

Definition at line 239 of file simplify.c.

240 {
241  pips_assert("as many new vars as fields\n",gen_length(fields)==gen_length(new_vars));
242  dssrhp p = { var, fields, new_vars };
245  /* also add a 'set all' operation at end ob block */
246  if(formal_parameter_p(var))
247  {
248  instruction fields_update = make_fields_assignment_instruction(var,fields,new_vars);
250  }
251 
252 }
#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
size_t gen_length(const list l)
Definition: list.c:150
#define pips_assert(what, predicate)
common macros, two flavors depending on NDEBUG
Definition: misc-local.h:172
#define statement_domain
newgen_sizeofexpression_domain_defined
Definition: ri.h:362
static void do_split_structure_return_hook_walker(statement s, dssrhp *p)
Definition: simplify.c:215
static instruction make_fields_assignment_instruction(entity var, list fields, list new_vars)
Definition: simplify.c:174

References do_split_structure_return_hook_walker(), formal_parameter_p(), gen_context_recurse, gen_length(), gen_true2(), get_current_module_statement(), insert_statement(), instruction_to_statement(), make_fields_assignment_instruction(), pips_assert, and statement_domain.

Referenced by do_split_structure().

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

◆ do_split_structure_return_hook_walker()

static void do_split_structure_return_hook_walker ( statement  s,
dssrhp p 
)
static

we return the same reference as the initial variable, update fields accordingly

Definition at line 215 of file simplify.c.

216 {
217  if(return_statement_p(s))
218  {
220  expression returned =
223  instruction_call(i):
225  )));
226  /* we return the same reference as the initial variable, update fields accordingly */
227  if(expression_reference_p(returned) &&
229  {
231  insert_statement(s,instruction_to_statement(fields_update),true);
232 
233  }
234 
235  }
236 }
bool return_statement_p(statement)
Test if a statement is a C or Fortran "return".
Definition: statement.c:172
bool same_entity_p(entity e1, entity e2)
predicates on entities
Definition: entity.c:1321
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
#define reference_variable(x)
Definition: ri.h:2326
#define instruction_call_p(x)
Definition: ri.h:1527
#define instruction_expression(x)
Definition: ri.h:1541
#define statement_instruction(x)
Definition: ri.h:2458
#define instruction_call(x)
Definition: ri.h:1529
list fields
Definition: simplify.c:169
entity var
Definition: simplify.c:168
list new_vars
Definition: simplify.c:170

References call_arguments, CAR, EXPRESSION, expression_call(), expression_reference(), expression_reference_p(), dssrhp::fields, insert_statement(), instruction_call, instruction_call_p, instruction_expression, instruction_to_statement(), make_fields_assignment_instruction(), dssrhp::new_vars, reference_variable, return_statement_p(), same_entity_p(), statement_instruction, and dssrhp::var.

Referenced by do_split_structure_return_hook().

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

◆ do_split_structures()

static void do_split_structures ( statement  s)
static

Definition at line 339 of file simplify.c.

340 {
341  if(statement_block_p(s))
342  {
343  list added = NIL;
345  {
346  list new = do_split_structure(e,s);
347  added=gen_nconc(added,new);
348  }
349  FOREACH(ENTITY,e,added)
351  gen_free_list(added);
352  }
353 
354 }
list gen_nconc(list cp1, list cp2)
physically concatenates CP1 and CP2 but do not duplicates the elements
Definition: list.c:344
#define statement_block_p(stat)
void AddLocalEntityToDeclarations(entity, entity, statement)
Add the variable entity e to the list of variables of the function module.
Definition: variable.c:233

References AddLocalEntityToDeclarations(), do_split_structure(), ENTITY, FOREACH, gen_free_list(), gen_nconc(), get_current_module_entity(), NIL, statement_block_p, and statement_declarations.

Referenced by split_structures().

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

◆ entity_used_in_calls()

static bool entity_used_in_calls ( entity  e)
static

Definition at line 118 of file simplify.c.

119 {
120  entity_used_in_calls_p p = { e, false};
122  return p.used;
123 }
#define call_domain
newgen_callees_domain_defined
Definition: ri.h:58
static void entity_used_in_calls_walker(call c, entity_used_in_calls_p *p)
Definition: simplify.c:94

References call_domain, entity_used_in_calls_walker(), gen_context_recurse, gen_true2(), get_current_module_statement(), and entity_used_in_calls_p::used.

Referenced by do_split_structure().

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

◆ entity_used_in_calls_walker()

static void entity_used_in_calls_walker ( call  c,
entity_used_in_calls_p p 
)
static

SG: as a special extension, we allow return call for it is handled elsewhere

Definition at line 94 of file simplify.c.

95 {
96  entity op = call_function(c);
97  if(!ENTITY_FIELD_P(op)&&!ENTITY_POINT_TO_P(op))
98  {
100  {
102  {
103  p->used=true;
104  }
105  }
106  /* SG: as a special extension, we allow return call
107  * for it is handled elsewhere*/
108  if(p->used) {
110  p->used=false;
111  else
112  gen_recurse_stop(0);
113  }
114  }
115 }
void gen_recurse_stop(void *obj)
Tells the recursion not to go in this object.
Definition: genClib.c:3251
#define ENTITY_POINT_TO_P(e)
#define ENTITY_FIELD_P(e)
C data structure and pointer management.
#define ENTITY_C_RETURN_P(e)
#define ENTITY_RETURN_P(e)

References call_arguments, call_function, entity_used_in_calls_p::e, ENTITY_C_RETURN_P, ENTITY_FIELD_P, ENTITY_POINT_TO_P, ENTITY_RETURN_P, exp, EXPRESSION, expression_reference(), expression_reference_p(), FOREACH, gen_recurse_stop(), reference_variable, same_entity_p(), and entity_used_in_calls_p::used.

Referenced by entity_used_in_calls().

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

◆ has_address_of_operator_p()

static bool has_address_of_operator_p ( expression  exp)
static

look for an & in the expression

Definition at line 24 of file simplify.c.

25 {
26  bool answer = false;
28  return answer;
29 }
void gen_null2(__attribute__((unused)) void *u1, __attribute__((unused)) void *u2)
idem with 2 args, to please overpeaky compiler checks
Definition: genClib.c:2758
static bool has_address_of_operator_walker_p(call c, bool *panswer)
Definition: simplify.c:18

References call_domain, exp, gen_context_recurse, gen_null2(), and has_address_of_operator_walker_p().

Referenced by simplify_subscript().

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

◆ has_address_of_operator_walker_p()

static bool has_address_of_operator_walker_p ( call  c,
bool panswer 
)
static

Definition at line 18 of file simplify.c.

19 {
20  return !(*panswer|=ENTITY_ADDRESS_OF_P(call_function(c)));
21 }
#define ENTITY_ADDRESS_OF_P(e)

References call_function, and ENTITY_ADDRESS_OF_P.

Referenced by has_address_of_operator_p().

+ Here is the caller graph for this function:

◆ make_fields_assignment_instruction()

static instruction make_fields_assignment_instruction ( entity  var,
list  fields,
list  new_vars 
)
static

this makes e.f

his makes udpated value of the fields

Definition at line 174 of file simplify.c.

175 {
176  list fields_update = NIL;
177  FOREACH(ENTITY,nv,new_vars)
178  {
179  entity f = ENTITY(CAR(fields));
180  fields_update=CONS(STATEMENT,
181  entity_scalar_p(nv) ?
187  )
188  ,/* this makes e.f */
189  entity_to_expression(nv)/*this makes udpated value of the fields */
190  ):
199  ),
204  )
205  )
206  ),
207  fields_update
208  );
209  POP(fields);
210  }
211  return make_instruction_sequence(make_sequence(gen_nreverse(fields_update)));
212 }
instruction make_instruction_sequence(sequence _field_)
Definition: ri.c:1169
sequence make_sequence(list a)
Definition: ri.c:2125
statement make_assign_statement(expression, expression)
Definition: statement.c:583
#define STATEMENT(x)
STATEMENT.
Definition: ri.h:2413

References CAR, CONS, ENTITY, entity_intrinsic(), entity_scalar_p(), entity_to_expression(), entity_type, f(), FIELD_OPERATOR_NAME, FOREACH, gen_nreverse(), instruction_to_statement(), make_assign_statement(), make_call_instruction(), make_expression(), make_expression_list, make_instruction_sequence(), make_sequence(), make_sizeofexpression_expression(), make_syntax_sizeofexpression(), MakeBinaryCall(), MEMCPY_FUNCTION_NAME, NIL, normalized_undefined, POINT_TO_OPERATOR_NAME, POP, STATEMENT, and type_struct_variable_p().

Referenced by do_split_structure_return_hook(), and do_split_structure_return_hook_walker().

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

◆ make_float_constant_expression()

expression make_float_constant_expression ( float  )

◆ replace_field_by_reference()

static void replace_field_by_reference ( entity  structure,
entity  field,
entity  new 
)
static

Definition at line 161 of file simplify.c.

162 {
163  rfr_param p = { structure, field,new };
165 }
static void replace_field_by_reference_walker(call c, rfr_param *p)
Definition: simplify.c:132

References call_domain, gen_context_recurse, gen_true2(), get_current_module_statement(), and replace_field_by_reference_walker().

Referenced by do_split_structure().

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

◆ replace_field_by_reference_walker()

static void replace_field_by_reference_walker ( call  c,
rfr_param p 
)
static

Definition at line 132 of file simplify.c.

133 {
134  entity op = call_function(c);
135  if(ENTITY_POINT_TO_P(op) || ENTITY_FIELD_P(op))
136  {
137  expression lhs = binary_call_lhs(c);
138  expression rhs = binary_call_rhs(c);
141  {
142  gen_chunk *ancestor = gen_get_recurse_ancestor(c);
143  if(INSTANCE_OF(syntax,ancestor))
144  {
145  free_call(c);
146  syntax s = (syntax)ancestor;
149  }
150  else
151  {
155  }
156  }
157  }
158 }
reference make_reference(entity a1, list a2)
Definition: ri.c:2083
void free_call(call p)
Definition: ri.c:236
void gen_full_free_list(list l)
Definition: genClib.c:1023
gen_chunk * gen_get_recurse_ancestor(const void *)
Get the first ancestor object encountered during the recursion for the given object.
Definition: genClib.c:3546
#define INSTANCE_OF(type, value)
polymorhism thanks to newgen !
#define UNARY_PLUS_OPERATOR_NAME
#define syntax_reference(x)
Definition: ri.h:2730
#define syntax_tag(x)
Definition: ri.h:2727
@ is_syntax_reference
Definition: ri.h:2691
struct _newgen_struct_syntax_ * syntax
Definition: ri.h:407
entity field
Definition: simplify.c:127
entity structure
Definition: simplify.c:126
entity new
Definition: simplify.c:128
A gen_chunk is used to store every object.
Definition: genC.h:58

References binary_call_lhs, binary_call_rhs, call_arguments, call_function, ENTITY_FIELD_P, entity_intrinsic(), ENTITY_POINT_TO_P, entity_to_expression(), expression_reference(), expression_reference_p(), rfr_param::field, free_call(), gen_full_free_list(), gen_get_recurse_ancestor(), INSTANCE_OF, is_syntax_reference, make_expression_list, make_reference(), rfr_param::new, NIL, reference_variable, same_entity_p(), rfr_param::structure, syntax_reference, syntax_tag, and UNARY_PLUS_OPERATOR_NAME.

Referenced by replace_field_by_reference().

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

◆ reset_the_i()

static void reset_the_i ( )
static

Definition at line 407 of file simplify.c.

407  {
409 }
#define entity_undefined
Definition: ri.h:2761
static entity THE_I
Definition: simplify.c:399

References entity_undefined, and THE_I.

Referenced by simplify_complex().

+ Here is the caller graph for this function:

◆ reset_translation_mode()

static void reset_translation_mode ( )
static

Definition at line 429 of file simplify.c.

429 { complex_translation=NULL;}
static void(* complex_translation)(list *, list)
Definition: simplify.c:411

References complex_translation.

Referenced by simplify_complex().

+ Here is the caller graph for this function:

◆ set_the_i()

static void set_the_i ( )
static

Definition at line 400 of file simplify.c.

400  {
405 }
basic make_basic_complex(intptr_t _field_)
Definition: ri.c:170
expression MakeComplexConstantExpression(expression r, expression i)
Definition: constant.c:397
#define DEFAULT_COMPLEX_TYPE_SIZE
expression float_to_expression(float c)
Definition: expression.c:1229
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

References AddEntityToCurrentModule(), DEFAULT_COMPLEX_TYPE_SIZE, entity_initial, float_to_expression(), free_value(), get_current_module_entity(), make_basic_complex(), make_new_scalar_variable_with_prefix(), make_value_expression(), MakeComplexConstantExpression(), and THE_I.

Referenced by simplify_complex().

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

◆ set_translation_mode()

static void set_translation_mode ( )
static

Definition at line 422 of file simplify.c.

423 {
424  if(get_bool_property("SIMPLIFY_COMPLEX_USE_ARRAY_OF_STRUCTS"))
426  else
428 }
bool get_bool_property(const string)
FC 2015-07-20: yuk, moved out to prevent an include cycle dependency include "properties....
void complex_translation_array_of_structs(list *pl, list l)
Definition: simplify.c:412
void complex_translation_struct_of_array(list *pl, list l)
Definition: simplify.c:416

References complex_translation, complex_translation_array_of_structs(), complex_translation_struct_of_array(), and get_bool_property().

Referenced by simplify_complex().

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

◆ simplify_c_operator()

void simplify_c_operator ( statement  s)

replace PLUS_C_OPERATOR_NAME by PLUS_OPERATOR_NAME when relevant

Definition at line 621 of file simplify.c.

621  {
623 }
static void do_simplify_c_operator(call c)
Definition: simplify.c:604

References call_domain, do_simplify_c_operator(), gen_recurse, and gen_true().

Referenced by reduction_propagation().

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

◆ simplify_complex()

bool simplify_complex ( const char *  module_name)

split complexes into an array with first element <> real part and second element <> imaginary part

prelude

change call to complex intrinsics

change other complex references

and all their declarations

validate

ostlude

Parameters
module_nameodule_name

Definition at line 578 of file simplify.c.

579 {
580  /* prelude */
583  set_the_i();
585 
586  /* change call to complex intrinsics */
587  /* change other complex references*/
589  /* and all their declarations */
591 
592  /* validate */
595 
596  /*postlude*/
598  reset_the_i();
601  return true;
602 }
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
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
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
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
static void reset_translation_mode()
Definition: simplify.c:429
static void set_translation_mode()
Definition: simplify.c:422
static void reset_the_i()
Definition: simplify.c:407
static void simplify_complex_statements(statement s)
Definition: simplify.c:571
static void simplify_complex_declaration(entity e)
Definition: simplify.c:451
static void set_the_i()
Definition: simplify.c:400

References db_get_memory_resource(), DB_PUT_MEMORY_RESOURCE, get_current_module_entity(), get_current_module_statement(), module_name(), module_name_to_entity(), module_reorder(), reset_current_module_entity(), reset_current_module_statement(), reset_the_i(), reset_translation_mode(), set_current_module_entity(), set_current_module_statement(), set_the_i(), set_translation_mode(), simplify_complex_declaration(), and simplify_complex_statements().

+ Here is the call graph for this function:

◆ simplify_complex_declaration()

static void simplify_complex_declaration ( entity  e)
static

Definition at line 451 of file simplify.c.

452 {
458  {
459  dummy d = parameter_dummy(p);
460  if(dummy_identifier_p(d))
462  }
465 }
int dummy
A dummy file, to prevent empty libraries from breaking builds.
Definition: dummy.c:41
#define entity_declarations(e)
MISC: newgen shorthands.
#define module_functional_parameters(func)
code entity_code(entity e)
Definition: entity.c:1098
#define dummy_identifier(x)
Definition: ri.h:1033
#define parameter_dummy(x)
Definition: ri.h:1823
#define code_declarations(x)
Definition: ri.h:784
#define PARAMETER(x)
PARAMETER.
Definition: ri.h:1788
#define value_code(x)
Definition: ri.h:3067
#define code_decls_text(x)
Definition: ri.h:786
#define dummy_identifier_p(x)
Definition: ri.h:1031
static void simplify_complex_entity(entity c)
adds a dimension to all entity whose basic is complex , and change their basic to float
Definition: simplify.c:433

References code_declarations, code_decls_text, dummy_identifier, dummy_identifier_p, ENTITY, entity_code(), entity_declarations, entity_initial, FOREACH, free(), module_functional_parameters, PARAMETER, parameter_dummy, simplify_complex_entity(), strdup(), and value_code.

Referenced by simplify_complex().

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

◆ simplify_complex_entity()

static void simplify_complex_entity ( entity  c)
static

adds a dimension to all entity whose basic is complex , and change their basic to float

Definition at line 433 of file simplify.c.

434 {
436  {
440  CONS(DIMENSION,
443  NIL),
444  NIL)
445  );
446  intptr_t old_basic = basic_complex(variable_basic(v));
448  variable_basic(v)=make_basic_float(old_basic);
449  }
450 }
basic make_basic_float(intptr_t _field_)
Definition: ri.c:161
dimension make_dimension(expression a1, expression a2, list a3)
Definition: ri.c:565
expression int_to_expression(_int i)
transform an int into an expression and generate the corresponding entity if necessary; it is not cle...
Definition: expression.c:1188
#define basic_complex_p(x)
Definition: ri.h:626
#define variable_dimensions(x)
Definition: ri.h:3122
#define basic_complex(x)
Definition: ri.h:628
#define intptr_t
Definition: stdint.in.h:294

References basic_complex, basic_complex_p, complex_translation, CONS, DIMENSION, entity_basic(), entity_type, entity_variable_p, free_basic(), int_to_expression(), intptr_t, make_basic_float(), make_dimension(), NIL, type_variable, variable_basic, and variable_dimensions.

Referenced by simplify_complex_declaration().

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

◆ simplify_complex_expression()

static bool simplify_complex_expression ( expression  e)
static

replace |.| by sqrt(re^2+im^2)

replace REAL(.) by .[0]

ok let's do something

replace the call by a reference

replace AIMAG(.) by .[1]

ok let's do something

replace the call by a reference

more to come

Definition at line 489 of file simplify.c.

490 {
491  basic b = basic_of_expression(e);
492  if(expression_call_p(e))
493  {
494  call c = expression_call(e);
495  entity op = call_function(c);
497  /* replace |.| by sqrt(re^2+im^2) */
498  if(ENTITY_CABS_P(op))
499  {
506  )
507  );
508  }
509  /* replace REAL(.) by .[0] */
511  {
512  if(expression_reference_p(arg)) /* ok let's do something */
513  {
516  /* replace the call by a reference */
522  }
523  else
524  pips_user_warning("case unhandled, this would require an atomization in fortran i guess\n");
525  }
526  /* replace AIMAG(.) by .[1] */
528  {
529  if(expression_reference_p(arg)) /* ok let's do something */
530  {
533  /* replace the call by a reference */
539  }
540  else
541  pips_user_warning("case unhandled, this would require an atomization in fortran i guess\n");
542  }
543  else if(basic_complex_p(b) && ENTITY_FIVE_OPERATION_P(op) )
544  {
545  expression e0 = binary_call_lhs(c),
546  e1 = binary_call_rhs(c);
547  basic b0 = basic_of_expression(e0),
550  {
551  *e0=*split_complex_expression(e0);
552  gen_recurse_stop(e0);
553  }
555  {
556  *e1=*split_complex_expression(e1);
557  gen_recurse_stop(e1);
558  }
559  free_basic(b0);
560  free_basic(b1);
561 
562  }
563  }
564  free_basic(b);
565  /* more to come */
566  return true;
567 
568 }
void free_normalized(normalized p)
Definition: ri.c:1407
void free_syntax(syntax p)
Definition: ri.c:2445
syntax make_syntax_reference(reference _field_)
Definition: ri.c:2494
#define pips_user_warning
Definition: misc-local.h:146
#define ENTITY_FIVE_OPERATION_P(e)
#define ENTITY_CABS_P(e)
#define SQRT_OPERATOR_NAME
#define AIMAG_CONVERSION_NAME
#define REAL_GENERIC_CONVERSION_NAME
entity CreateIntrinsic(string name)
this function does not create an intrinsic function because they must all be created beforehand by th...
Definition: entity.c:1311
expression MakeUnaryCall(entity f, expression a)
Creates a call expression to a function with one argument.
Definition: expression.c:342
#define reference_undefined
Definition: ri.h:2302
#define expression_normalized(x)
Definition: ri.h:1249
#define reference_indices(x)
Definition: ri.h:2328
Value b1
booleen indiquant quel membre est en cours d'analyse
Definition: sc_gram.c:105
static expression split_complex_expression(expression e)
Definition: simplify.c:467

References AIMAG_CONVERSION_NAME, b1, basic_complex_p, basic_of_expression(), binary_call_lhs, binary_call_rhs, call_arguments, call_function, CAR, complex_translation, copy_expression(), CreateIntrinsic(), ENDP, ENTITY_CABS_P, ENTITY_FIVE_OPERATION_P, EXPRESSION, expression_call(), expression_call_p(), expression_normalized, expression_reference(), expression_reference_p(), expression_syntax, expression_undefined, free_basic(), free_normalized(), free_syntax(), gen_free_list(), gen_recurse_stop(), int_to_expression(), make_expression_list, make_syntax_reference(), MakeBinaryCall(), MakeUnaryCall(), normalized_undefined, pips_user_warning, PLUS_OPERATOR_NAME, REAL_GENERIC_CONVERSION_NAME, reference_indices, reference_undefined, same_entity_p(), split_complex_expression(), SQRT_OPERATOR_NAME, and syntax_reference.

Referenced by simplify_complex_statements().

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

◆ simplify_complex_statements()

static void simplify_complex_statements ( statement  s)
static

do the job

Definition at line 571 of file simplify.c.

572 {
573  /* do the job */
575 }
void gen_null(__attribute__((unused)) void *unused)
Ignore the argument.
Definition: genClib.c:2752
static bool simplify_complex_expression(expression e)
Definition: simplify.c:489

References expression_domain, gen_null(), gen_recurse, and simplify_complex_expression().

Referenced by simplify_complex().

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

◆ simplify_constant_address_expressions()

bool simplify_constant_address_expressions ( const char *  module_name)

transforms *"aer" into 'a' do not take care of "aer"[2] but could be extended to

Parameters
module_nameodule_name

Definition at line 657 of file simplify.c.

657  {
660 
664  0
665  );
668  return true;
669 }
void gen_multi_recurse(void *o,...)
Multi recursion visitor function.
Definition: genClib.c:3428
static void do_simplify_constant_address_expression_in_decl(statement st)
forward processing through declarations
Definition: simplify.c:647

References db_get_memory_resource(), do_simplify_constant_address_expression(), do_simplify_constant_address_expression_in_decl(), expression_domain, gen_multi_recurse(), gen_true(), get_current_module_statement(), module_name(), module_name_to_entity(), 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:

◆ simplify_subscript()

static void simplify_subscript ( subscript  ss)
static

the walker

do nothing if an address-of is involved - over cautious indeed

create atomized_expression

create replacement reference

do the replacement

ree stuffs a bit less carefully than I should

we must do this now and not before

Definition at line 32 of file simplify.c.

33 {
34  statement parent_statement = (statement)gen_get_ancestor(statement_domain,ss);
35  expression ss_array = subscript_array(ss);
36  /* do nothing if an address-of is involved - over cautious indeed */
37  if( !has_address_of_operator_p(ss_array) )
38  {
39  /* create atomized_expression */
40  basic exp_basic = basic_of_expression(ss_array);
42  AddEntityToCurrentModule(new_entity);
43  statement new_statement = make_assign_statement(entity_to_expression(new_entity),ss_array);
44 
45  /* create replacement reference */
46  reference new_ref= make_reference(new_entity,subscript_indices(ss));
47  /* do the replacement */
48  expression parent_expression = (expression) gen_get_ancestor(expression_domain,ss);
49  /*free stuffs a bit less carefully than I should*/
50  expression_syntax(parent_expression)=syntax_undefined;
51  update_expression_syntax(parent_expression,make_syntax_reference(new_ref));
52  /* we must do this now and not before */
53  insert_statement(parent_statement,new_statement,true);
54  }
55 }
struct _newgen_struct_expression_ * expression
Definition: alias_private.h:21
struct _newgen_struct_statement_ * statement
Definition: cloning.h:21
gen_chunk * gen_get_ancestor(int, const void *)
return the first ancestor object found of the given type.
Definition: genClib.c:3560
entity make_new_scalar_variable(entity, basic)
Definition: variable.c:741
#define subscript_indices(x)
Definition: ri.h:2563
#define subscript_array(x)
Definition: ri.h:2561
static bool has_address_of_operator_p(expression exp)
look for an & in the expression
Definition: simplify.c:24

References AddEntityToCurrentModule(), basic_of_expression(), entity_to_expression(), expression_domain, expression_syntax, gen_get_ancestor(), get_current_module_entity(), has_address_of_operator_p(), insert_statement(), make_assign_statement(), make_new_scalar_variable(), make_reference(), make_syntax_reference(), statement_domain, subscript_array, subscript_indices, syntax_undefined, and update_expression_syntax().

Referenced by do_simplify_subscripts().

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

◆ simplify_subscripts()

bool simplify_subscripts ( const char *  module_name)

atomize subscript expressions so that thay can be reprsetned as references

simplify.c

prelude

do the job

validate

ostlude

Parameters
module_nameodule_name

Definition at line 64 of file simplify.c.

65 {
66  /* prelude */
69 
70  /* do the job */
72 
73  /* validate */
76 
77  /*postlude*/
80  return true;
81 }
static void do_simplify_subscripts(statement s)
Definition: simplify.c:57

References db_get_memory_resource(), DB_PUT_MEMORY_RESOURCE, do_simplify_subscripts(), get_current_module_statement(), module_name(), module_name_to_entity(), module_reorder(), reset_current_module_entity(), reset_current_module_statement(), set_current_module_entity(), and set_current_module_statement().

+ Here is the call graph for this function:

◆ split_complex_expression()

static expression split_complex_expression ( expression  e)
static

Definition at line 467 of file simplify.c.

468 {
470  list ri = reference_indices(r);
471 
472  list ri0 = gen_full_copy_list(ri);
474  list ri1 = gen_full_copy_list(ri);
476 
484  )
485  );
486  return new;
487 }
list gen_full_copy_list(list l)
Copy a list structure with element copy.
Definition: list.c:535
#define MULTIPLY_OPERATOR_NAME
expression reference_to_expression(reference r)
Definition: expression.c:196

References complex_translation, CreateIntrinsic(), entity_to_expression(), expression_reference(), gen_full_copy_list(), int_to_expression(), make_expression_list, make_reference(), MakeBinaryCall(), MULTIPLY_OPERATOR_NAME, PLUS_OPERATOR_NAME, reference_indices, reference_to_expression(), reference_variable, and THE_I.

Referenced by simplify_complex_expression().

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

◆ split_structures()

bool split_structures ( const char *  module_name)

prelude

do the job for declared structures

now do the job for parameter structures

change useless subscripts

validate

ostlude

Parameters
module_nameodule_name

Definition at line 365 of file simplify.c.

366 {
367  /* prelude */
370 
371  /* do the job for declared structures */
374  /* now do the job for parameter structures */
378 
379  /* change useless subscripts */
381 
382  /* validate */
385 
386  /*postlude*/
389  return true;
390 }
void cleanup_subscripts(void *)
if(!(yy_init))
Definition: genread_lex.c:1029
#define true
Definition: newgen_types.h:81
return(s1)
static void do_split_structures(statement s)
Definition: simplify.c:339
static void do_split_structure_parameter(entity e)
Definition: simplify.c:357

References cleanup_subscripts(), db_get_memory_resource(), DB_PUT_MEMORY_RESOURCE, do_split_structure_parameter(), do_split_structures(), ENTITY, entity_declarations, FOREACH, formal_parameter_p(), gen_recurse, gen_true(), get_current_module_entity(), get_current_module_statement(), module_name(), 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:

Variable Documentation

◆ complex_translation

void(* complex_translation) (list *, list) ( list ,
list   
) =NULL
static

◆ THE_I

entity THE_I = entity_undefined
static

Definition at line 399 of file simplify.c.

Referenced by reset_the_i(), set_the_i(), and split_complex_expression().