inline void push(int d) {
	int oldTop, newTop,ret;
	__VERIFIER_atomic_index_malloc(&newTop);
	if(newTop == 0)
		exit(-1);
	INDIR(newTop,0) = d;
	while (1) {
		oldTop = top;
		INDIR(newTop,1) = oldTop;
		__VERIFIER_atomic_CAS(&top,oldTop,newTop,&ret);
		if(ret)	return;
	}
}
void push(int d) {
  int oldTop, newTop;
  __VERIFIER_atomic_index_malloc(&newTop);
  if(newTop == 0)
    exit(-1);
  INDIR(newTop,0) = d;
  while (1) {
    oldTop = top;
    INDIR(newTop,1) = oldTop;
    if(__sync_bool_compare_and_swap(&top,oldTop,newTop))
      return;
  }
}
inline void push(int d) {
	int oldTop = -1, newTop = -1;

	__VERIFIER_atomic_index_malloc(&newTop);
	if(newTop == 0)
		exit(-1);
	else{
		INDIR(newTop,0) = d;
		__VERIFIER_atomic_acquire();
		oldTop = top;
		INDIR(newTop,1) = oldTop;
		top = newTop; 
		__VERIFIER_atomic_release();
	}
}