/*
 * Program: llc
 * 
 * Test Name: badfuncptr.c
 * 
 * Test Problem:
 *      Indirect call via function pointer is mishandled in reg. alloc.
 *      The indirect call address was allocated the same register as the
 *      first outgoing argument, so it was overwritten before the call.
 *
 * Test Resolution:
 *      In PhyRegAlloc.cpp, mark the live range for the indirect call
 *      address as having a Call Interference.  This has to be done
 *      as a special case since it may not be live after the call.
 *
 * Resolution Status:
 *      Fixed on 3/29/02 -- Adve.
 */
/* For copyright information, see olden_v1.0/COPYRIGHT */

#include <stdlib.h>
/* #include "hash.h" */
/*--------*/
/* hash.h */
/*--------*/
/* For copyright information, see olden_v1.0/COPYRIGHT */

#include "stdio.h"

typedef struct hash_entry {
  unsigned int key;
  void *entry;
  struct hash_entry *next;
} *HashEntry;

typedef struct hash {
  HashEntry *array;
  int (*mapfunc)(unsigned int);
  int size;
} *Hash;

Hash MakeHash(int size, int (*map)(unsigned int));
void *HashLookup(unsigned int key, Hash hash);
void HashInsert(void *entry,unsigned int key, Hash hash);
void HashDelete(unsigned int key, Hash hash);
/*--------*/
/* END hash.h */
/*--------*/

#define assert(num,a) if (!(a)) {printf("Assertion failure:%d in hash\n",num); exit(-1);}

void *HashLookup(unsigned int key, Hash hash)
{
  int j;
  HashEntry ent;
  
  j = (hash->mapfunc)(key);        /* 14% miss in hash->mapfunc */  
  assert(1,j>=0);
  assert(2,j<hash->size);
  for (ent = hash->array[j];       /* 17% miss in hash->array[j] */ /* adt_pf can't detect :( */
       ent &&                      /* 47% miss in ent->key */       /* adt_pf can detect :) */
           ent->key!=key; 
       ent=ent->next);             /* 8% miss in ent->next */       /* adt_pf can detect :) */
  if (ent) return ent->entry;
  return NULL;
}

/* essentially dummy main so testing does not fail */
int
main()
{
  printf("&HashLookup = %d\n", !!HashLookup);
  return 0;
}
