mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7335 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			83 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* FIXME: this testcase should be automated! */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
typedef struct Tree_struct {
 | 
						|
  int data;
 | 
						|
  struct Tree_struct *left, *right;
 | 
						|
} Tree;
 | 
						|
 | 
						|
static Tree T1, T2, T3, T4, T5, T6, T7;
 | 
						|
static Tree *Root, *ANode;
 | 
						|
static int  N = 4107;
 | 
						|
 | 
						|
/* forces *Tb->right to be collapsed */
 | 
						|
void makeMore(Tree* Ta, Tree* Tb)
 | 
						|
{
 | 
						|
  Ta->left  = &T1;
 | 
						|
  Ta->right = &T2;
 | 
						|
  Tb->left  = &T4;
 | 
						|
  /* Tb->right = &T5; */
 | 
						|
  Tb->right = (Tree*) (((char*) &T5) + 5); /* point to fifth byte of T5 */
 | 
						|
}
 | 
						|
 | 
						|
/* multiple calls to this should force globals to be merged in TD graph
 | 
						|
 * but not in globals graph
 | 
						|
 */
 | 
						|
void makeData(Tree* Ta)
 | 
						|
{
 | 
						|
  static int N = 101;
 | 
						|
  Ta->data = N;
 | 
						|
}
 | 
						|
 | 
						|
void makeRoots()
 | 
						|
{
 | 
						|
  T1.left = &T2;
 | 
						|
  makeMore(&T1, &T3);
 | 
						|
}
 | 
						|
 | 
						|
/* BU graph shows T1.left->{T2}, but TD graph should show T1.left->{T1,T2,T6,H}
 | 
						|
 * and T.right->{T1,T2,T6,H} */
 | 
						|
void makeAfter1()
 | 
						|
{
 | 
						|
  T1.left = &T2;
 | 
						|
}
 | 
						|
 | 
						|
/* BU graph shows:
 | 
						|
 *      T2.right->{H}, H.left->{T6}; H.right->{T2}, T3.left<->T7.left
 | 
						|
 * 
 | 
						|
 * TD graph and GlobalsGraph should show:
 | 
						|
 *      T2.right->{T1,T2,T6,H}
 | 
						|
 *      H.left->{T1,T2,T6,H}; H.right->{T1,T2,T6,H}.
 | 
						|
 *      T3.left->{T4,T7}, T3.right->{T4,T7}, T7.left->{T3}
 | 
						|
 */
 | 
						|
void makeAfter2()
 | 
						|
{
 | 
						|
  Tree* newT  = (Tree*) malloc(sizeof(Tree));
 | 
						|
  T2.right    = newT;                   /* leaked: do not access T2 in main */
 | 
						|
  newT->left  = &T6;
 | 
						|
  newT->right = &T2;
 | 
						|
 | 
						|
  T3.left     = &T7;
 | 
						|
  T7.left     = &T3;
 | 
						|
}
 | 
						|
 | 
						|
/* BU and TD graphs should have no reachable globals, forcing callers and
 | 
						|
 * callees to get all globals from GlobalsGraph
 | 
						|
 */
 | 
						|
void makePass()
 | 
						|
{
 | 
						|
  makeAfter1();
 | 
						|
  makeAfter2();
 | 
						|
}
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
  makeRoots();
 | 
						|
  T3.right = &T4;
 | 
						|
  makeData(&T3);
 | 
						|
  makeData(&T5);
 | 
						|
  makePass();
 | 
						|
  printf("T3.data = %d\n", T3.data);
 | 
						|
}
 |