🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.gcc.bug
Article #6305

sparc delay bug test case

#6305
From: Mark Bromley
Date: Wed, 13 Dec 1995 00:00
84 lines
2560 bytes
A follow up to my previous bug report.  This is a small test case that
illustrates the problem.  The function delaybug will return 100 when
it is clear from the initialization of set_mask and position[0].w_pawn
that this should not happen.  Build by

gcc -msupersparc -O2 -o bug smallbug.c -static -Xlinker -align -Xlinker _position

The -Xlinker -align -Xlinker _position is required to be able to
compute at compile time what the errant address will be.

struct {
  unsigned long long w_pawn;
  unsigned long long b_pawn;
} position[32];

unsigned long long set_mask[64];
unsigned long long file_mask[8];

int delaybug (int ply, int x)
{
  int faults = 0;
  int rpfile;
  int npfile;
  int bpfile;
  int i;

  if (x < 3) {
    rpfile=2;
    npfile=1;
    bpfile=0;
  }
  else if (x > 4) {
    rpfile=7;
    npfile=6;
    bpfile=5;
  }
  else {
    faults+= (6) ;
  }

  if (!faults) {
    if ((( position[ ply ].w_pawn  ) & ( set_mask[rpfile+8] )) );
    else if ((( position[ ply ].w_pawn  ) & ( set_mask[rpfile+16] )) )
      faults+= (4) ;
    else if ((( position[ ply ].w_pawn  ) & ( set_mask[rpfile+24] )) )
      faults+= (9) ;

    /* BUG BUG BUG */
    /* The bug makes the reference to position[ply].w_pawn actually refer
     * to set_mask[24] (when position has been page aligned) */
    if ((( position[ ply ].w_pawn  ) & ( set_mask[npfile+8] )) )
      faults += 100;
    else if ((( position[ ply ].w_pawn  ) & ( set_mask[npfile+16] )) ) 
      faults+= (3) ;
    else if ((( position[ ply ].w_pawn  ) & ( set_mask[npfile+24] )) )
      faults+= (9) ;
    else if (! (( position[ ply ].w_pawn  ) & ( file_mask[npfile] )) ) {
      faults+= (12) ;
      if (! (( position[ ply ].b_pawn  ) & ( file_mask[npfile] )) )
	faults+= (15) ;
    }
    if (faults > 1) {
      if ((( position[ ply ].w_pawn  ) & ( set_mask[bpfile+8] )) );
    }

  }

  return faults;
}

main ()
{
  int faults;

  position[0].w_pawn = 1;
  set_mask[18] = 1;
  set_mask[24] = 2;
  set_mask[9] = 2;

  faults = delaybug (0, 0);

  if (faults >= 100)
    printf ("error\n");
}
Technical Details
Message-ID: <199512132046.PAA09632@gate3.fmr.com>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII-7-bit
X-Google-Thread: 113d02,9d7c995b21c44e53,start
X-Google-Attributes: gid113d02,public
From: a200739@vantage.fmr.COM (Mark Bromley)
Subject: sparc delay bug test case
Date: 1995/12/13
Message-ID: <199512132046.PAA09632@gate3.fmr.com>
X-Deja-AN: 121757914
distribution: gnu
sender: daemon@cis.ohio-state.edu
organization: GNUs Not Usenet
newsgroups: gnu.gcc.bug