This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

ARM bug



OK, this is pretty strange.

Given this code in integrate.c:

 else if (GET_CODE (loc) == REG)
    {
      /* The function returns an object in a register and we use the return
         value.  Set up our target for remapping.  */

      /* Machine mode function was declared to return.   */
      enum machine_mode departing_mode = TYPE_MODE (type);
      /* (Possibly wider) machine mode it actually computes
         (for the sake of callers that fail to declare it right).
	     We have to use the mode of the result's RTL, rather than
	     its type, since expand_function_start may have promoted it.  */
      enum machine_mode arriving_mode
        = GET_MODE (DECL_RTL (DECL_RESULT (fndecl)));
 
this is what's coming out:

  cmp     r2, #57
  bne     .L380
  and     r3, r3, #255
  mov     r1, r6
  mov     r5, r3, lsr #1
  bl      make_decl_rtl

The comparison is the `GET_CODE (loc) == REG' bit; the code for REG is
57.

Then, as far as I can tell, we unconditionally call make_decl_rtl,
despite the conditional in DECL_RTL's definition.  If this rings bells
for anyone, let me know; otherwise, I'll keep on trying to figure out
what's going on.

--
Mark Mitchell                   mark@codesourcery.com
CodeSourcery, LLC               http://www.codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]