asm if-conversion buglet

Richard Henderson rth@cygnus.com
Mon May 8 22:02:00 GMT 2000


We transformed

	t = foo();
	if (!t) {
	   asm("bugcheck");
	   return 0;
	}

into

	bsr foo
	bugcheck
	mov 0,r0
	beq .Lreturn

which is not quite what the programmer had in mind.


r~

        * rtlanal.c (may_trap_p): Consider old-style and volatile
        asms to trap.

Index: rtlanal.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/rtlanal.c,v
retrieving revision 1.60
diff -c -p -d -r1.60 rtlanal.c
*** rtlanal.c	2000/05/05 16:48:24	1.60
--- rtlanal.c	2000/05/09 04:57:19
*************** may_trap_p (x)
*** 1743,1752 ****
      case SCRATCH:
        return 0;
  
!       /* Conditional trap can trap!  */
      case UNSPEC_VOLATILE:
      case TRAP_IF:
        return 1;
  
        /* Memory ref can trap unless it's a static var or a stack slot.  */
      case MEM:
--- 1743,1755 ----
      case SCRATCH:
        return 0;
  
!     case ASM_INPUT:
      case UNSPEC_VOLATILE:
      case TRAP_IF:
        return 1;
+ 
+     case ASM_OPERANDS:
+       return MEM_VOLATILE_P (x);
  
        /* Memory ref can trap unless it's a static var or a stack slot.  */
      case MEM:


More information about the Gcc-patches mailing list