________________________________


I'm trying to determine during LTO optimization (with one partition)
whether of not a function call is to a function in the partition.

Here is the routine I've written. Note, I'm willing to admit up front
that the comparison below ( ) is probably dicey.

---------------------------
static bool
is_user_function ( gimple *call_stmt)
{
  tree fndecl = gimple_call_fndecl ( call_stmt);

  DEBUG_L("is_user_function: decl in: %p,", fndecl);
  DEBUG_F( print_generic_decl, stderr, fndecl, (dump_flags_t)-1);
  DEBUG("\n");
  INDENT(2);

  cgraph_node* node;
  bool ret_val = false;
  FOR_EACH_FUNCTION_WITH_GIMPLE_BODY ( node)
  {
    DEBUG_L("decl %p,", node->decl);
    DEBUG_F( print_generic_decl, stderr, node->decl, (dump_flags_t)-1);
    DEBUG("\n");

    if ( node->decl == fndecl )
      {
    ret_val = true;
    break;
      }
  }

  INDENT(-2);
  return ret_val;
}
---------------------------

Here's the test program I was compiling.

-- aux.h ------------------
#include "stdlib.h"
typedef struct type type_t;
struct type {
  int i;
  double x;
};

#define MAX(x,y) ((x)>(y) ? (x) : (y))

extern int max1( type_t *, size_t);
extern double max2( type_t *, size_t);
extern type_t *setup( size_t);
-- aux.c ------------------
#include "aux.h"
#include "stdlib.h"

type_t *
setup( size_t size)
{
  type_t *data = (type_t *)malloc( size * sizeof(type_t));
  size_t i;
  for( i = 0; i < size; i++ ) {
    data[i].i = rand();
    data[i].x = drand48();
  }
  return data;
}

int
max1( type_t *array, size_t len)
{
  size_t i;
  int result = array[0].i;
  for( i = 1; i < len; i++  ) {
    result = MAX( array[i].i, result);
  }
  return result;
}

double
max2( type_t *array, size_t len)
{
  size_t i;
  double result = array[0].x;
  for( i = 1; i < len; i++  ) {
    result = MAX( array[i].x, result);
  }
  return result;
}
-- main.c -----------------
#include "aux.h"
#include "stdio.h"

type_t *data1;

int
main(void)
{
  type_t *data2 = setup(200);
  data1 = setup(100);

  printf("First %d\n" , max1(data1,100));
  printf("Second %e\n", max2(data2,200));
}
---------------------------

The output follows:

---------------------------
L# 1211: is_user_function: decl in: 0x7f078461be00,  static intD.xxxx 
max1D.xxxx (struct type_t *, size_t);
L# 1222:   decl 0x7f0784620000,  static struct type_t * setupD.xxxx (size_t);
L# 1222:   decl 0x7f078461bf00,  static intD.xxxx max1.constprop.0D.xxxx 
(struct type_t *);
L# 1222:   decl 0x7f078461bd00,  static doubleD.xxxx max2.constprop.0D.xxxx 
(struct type_t *);
L# 1222:   decl 0x7f078461bb00,  static intD.xxxx mainD.xxxx (void);
---------------------------

Now it's pretty obvious that constant propagation decided the size_t
len arguments to max1 and max2 were no longer needed. However, the
function declaration information on the calls to them weren't updated
so they'll never match. Now if there is another way to see if the
function is in the partition or if there is some other way to compare
the functions in a partition, please let me know.

Thanks,

Gary Oblock
Ampere Computing

PS. The body of the message is attached in a file because my email program
(Outlook) mangled the above.



CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is for 
the sole use of the intended recipient(s) and contains information that is 
confidential and proprietary to Ampere Computing or its subsidiaries. It is to 
be used solely for the purpose of furthering the parties' business 
relationship. Any review, copying, or distribution of this email (or any 
attachments thereto) is strictly prohibited. If you are not the intended 
recipient, please contact the sender immediately and permanently delete the 
original and any copies of this email and any attachments thereto.

Attachment: gcc_msg
Description: gcc_msg

Reply via email to