Enabling optimization (starting with -O option) the following code is
erroneously compiled:

obj_t BGl_GLOPz00zz__evmeaningz00(obj_t BgL_codez00_1, obj_t BgL_stackz00_2) {
    AN_OBJECT;
    obj_t BgL_g1120z00_632;

    obj_t BgL_vectorz00_1820;
    int BgL_kz00_1821;

    BgL_vectorz00_1820 = BgL_codez00_1;
    BgL_kz00_1821 = (int) (((long) 3));
    BgL_g1120z00_632 = VECTOR_REF(BgL_vectorz00_1820, BgL_kz00_1821);

    {
       obj_t BgL_valsz00_1823;
       obj_t BgL_envz00_1824;

       BgL_valsz00_1823 = BgL_g1120z00_632;
       BgL_envz00_1824 = BgL_stackz00_2;
       printf( "AVANT LOOP: %p code=%p\n", BgL_valsz00_1823, BgL_codez00_1);
       dprint( BgL_valsz00_1823 );
       dprint( BgL_codez00_1 );

    BgL_loopz00_1822:
       if( !((NULLP(BgL_valsz00_1823)) || (PAIRP( BgL_valsz00_1823 ) ) ) ) {
          fprintf( stderr, "GOT ONE: %p code=%p\n", BgL_valsz00_1823,
BgL_codez00_1 );
          dprint( BgL_valsz00_1823 );
          dprint( BgL_codez00_1 );
          exit( 12 );
       }
       if (NULLP(BgL_valsz00_1823)) {
          obj_t BgL_arg1193z00_1832;

          {
             obj_t BgL_vectorz00_1838;
             int BgL_kz00_1839;

                BgL_vectorz00_1838 = BgL_codez00_1;

             BgL_kz00_1839 = (int) (((long) 2));
             BgL_arg1193z00_1832 =
                VECTOR_REF(BgL_vectorz00_1838, BgL_kz00_1839);
          }
          return
             BGl_evmeaningz00zz__evmeaningz00(BgL_arg1193z00_1832,
                                              BgL_envz00_1824);
       } else {
          obj_t BgL_arg1194z00_1833;
          obj_t BgL_arg1195z00_1834;

          BgL_arg1194z00_1833 = CDR(BgL_valsz00_1823);
          fprintf( stderr, "CDR=%p\n", BgL_arg1194z00_1833 );
          {
             obj_t BgL_arg1196z00_1835;

             {
                obj_t BgL_arg1197z00_1836;


                BgL_arg1197z00_1836 = CAR(BgL_valsz00_1823);
                BgL_arg1196z00_1835 =
                   BGl_evmeaningz00zz__evmeaningz00(BgL_arg1197z00_1836,
                                                    BgL_stackz00_2);
             }
             BgL_arg1195z00_1834 =
                MAKE_PAIR(BgL_arg1196z00_1835, BgL_envz00_1824);
          }
          {
             obj_t BgL_envz00_6066;
             obj_t BgL_valsz00_6065;

             fprintf( stderr, "CDR.2=%p\n", BgL_arg1194z00_1833 );
             BgL_valsz00_6065 = BgL_arg1194z00_1833;
             BgL_envz00_6066 = BgL_arg1195z00_1834;
             BgL_envz00_1824 = BgL_envz00_6066;
             BgL_valsz00_1823 = BgL_valsz00_6065;
             goto BgL_loopz00_1822;
          }
       }
    }
 }


That is, the variable BgL_arg1194z00_1833 is not BgL_arg1194z00_1833 correctly
restored after the call to BGl_evmeaningz00zz__evmeaningz00. That is, the two
calls to printf show different value for that variable while it is not
changed.

Here is the definition of the fault function extracted from the .i file:

obj_t BGl_GLOPz00zz__evmeaningz00(obj_t BgL_codez00_1, obj_t BgL_stackz00_2) {
    ;
    obj_t BgL_g1120z00_632;

    obj_t BgL_vectorz00_1820;
    int BgL_kz00_1821;

    BgL_vectorz00_1820 = BgL_codez00_1;
    BgL_kz00_1821 = (int) (((long) 3));
    BgL_g1120z00_632 = (&(((obj_t)(BgL_vectorz00_1820))->vector_t.obj0))[
BgL_kz00_1821 ];

    {
       obj_t BgL_valsz00_1823;
       obj_t BgL_envz00_1824;

       BgL_valsz00_1823 = BgL_g1120z00_632;
       BgL_envz00_1824 = BgL_stackz00_2;
       printf( "AVANT LOOP: %p code=%p\n", BgL_valsz00_1823, BgL_codez00_1);
       dprint( BgL_valsz00_1823 );
       dprint( BgL_codez00_1 );

    BgL_loopz00_1822:
       if( !((((long)(BgL_valsz00_1823) ==
(long)((obj_t)(obj_t)((long)(((long)(0) << 2) | 2))))) ||
(((((long)BgL_valsz00_1823) & ((1 << 2) - 1)) == 3) ) ) ) {
   fprintf( stderr, "GOT ONE: %p code=%p\n", BgL_valsz00_1823, BgL_codez00_1 );
   dprint( BgL_valsz00_1823 );
   dprint( BgL_codez00_1 );
   exit( 12 );
       }
       if (((long)(BgL_valsz00_1823) == (long)((obj_t)(obj_t)((long)(((long)(0)
<< 2) | 2))))) {
   obj_t BgL_arg1193z00_1832;

   {
      obj_t BgL_vectorz00_1838;
      int BgL_kz00_1839;

  BgL_vectorz00_1838 = BgL_codez00_1;

      BgL_kz00_1839 = (int) (((long) 2));
      BgL_arg1193z00_1832 =
  (&(((obj_t)(BgL_vectorz00_1838))->vector_t.obj0))[ BgL_kz00_1839 ];
   }
   return
      BGl_evmeaningz00zz__evmeaningz00(BgL_arg1193z00_1832,
           BgL_envz00_1824);
       } else {
   obj_t BgL_arg1194z00_1833;
   obj_t BgL_arg1195z00_1834;

   BgL_arg1194z00_1833 = ((((obj_t)((long)BgL_valsz00_1823 - 3))->pair_t).cdr);
   fprintf( stderr, "CDR=%p\n", BgL_arg1194z00_1833 );
   {
      obj_t BgL_arg1196z00_1835;

      {
  obj_t BgL_arg1197z00_1836;


  BgL_arg1197z00_1836 = ((((obj_t)((long)BgL_valsz00_1823 - 3))->pair_t).car);
  BgL_arg1196z00_1835 =
     BGl_evmeaningz00zz__evmeaningz00(BgL_arg1197z00_1836,
          BgL_stackz00_2);
      }
      BgL_arg1195z00_1834 =
  make_pair( BgL_arg1196z00_1835, BgL_envz00_1824 );
   }
   {
      obj_t BgL_envz00_6066;
      obj_t BgL_valsz00_6065;

      fprintf( stderr, "CDR.2=%p\n", BgL_arg1194z00_1833 );
      BgL_valsz00_6065 = BgL_arg1194z00_1833;
      BgL_envz00_6066 = BgL_arg1195z00_1834;
      BgL_envz00_1824 = BgL_envz00_6066;
      BgL_valsz00_1823 = BgL_valsz00_6065;
      goto BgL_loopz00_1822;
   }
       }
    }
 }


-- 
           Summary: Faulty register allocation
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: blocker
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: manuel dot serrano at inria dot fr
 GCC build triplet: ../gcc-4.1.1/configure --prefix=/usr --enable-shared --
                    enable-la
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29816

Reply via email to