------- Comment #9 from rguenth at gcc dot gnu dot org  2008-03-01 14:29 -------
If you remove libcall notes around all binops then the following testcase
passes in dg-torture:

/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin*
*-*-darwin[912]* } } */
/* { dg-options "-ftrapv" } */

#include <stdlib.h>
#include <limits.h>
#include <signal.h>

int ok;

void handle_abort (int sig)
{
  if (sig == SIGABRT)
    {
      ok = 1;
      exit (0);
    }
}

int __attribute__((noinline))
iaddv (int a, int b)
{
  return a + b;
}

volatile int x;

int main(void)
{
  struct sigaction sa;
  sigemptyset (&sa.sa_mask);
  sa.sa_handler = handle_abort;
  sa.sa_flags = SA_RESETHAND;
  if (sigaction (SIGABRT, &sa, NULL) == -1)
    return 0;
  /* ???  iaddv is analyzed to be pure, so use the result.  */
  x = iaddv (INT_MAX, 1);
  sa.sa_handler = SIG_DFL;
  if (sigaction (SIGABRT, &sa, NULL) == -1)
    return 0;
  if (!ok)
    abort ();
  return 0;
}

but I get a build failure of libjava then:

gnu/java/nio/natVMSelector.cc: In static member function 'static jint
gnu::java::nio::VMSelector::select(JArray<__java_int>*, JArray<__java_int>*,
JArray<__java_int>*, jlong)':
gnu/java/nio/natVMSelector.cc:127: error: unable to find a register to spill in
class 'AD_REGS'
gnu/java/nio/natVMSelector.cc:127: error: this is the insn:
(insn 58 57 59 6 gnu/java/nio/natVMSelector.cc:82 (parallel [
            (set (reg:DI 4 si [165])
                (mult:DI (zero_extend:DI (reg:SI 0 ax))
                    (zero_extend:DI (reg:SI 2 cx [166]))))
            (clobber (reg:CC 17 flags))
        ]) 304 {*umulsidi3_insn} (expr_list:REG_DEAD (reg:SI 2 cx [166])
        (expr_list:REG_DEAD (reg:SI 0 ax)
            (expr_list:REG_UNUSED (reg:CC 17 flags)
                (expr_list:REG_EQUAL (mult:DI (zero_extend:DI (reg:SI 0 ax))
                        (const_int 1000 [0x3e8]))
                    (nil))))))
gnu/java/nio/natVMSelector.cc:127: internal compiler error: in spill_failure,
at reload1.c:2000
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.


with the following patch

Index: optabs.c
===================================================================
--- optabs.c    (revision 132790)
+++ optabs.c    (working copy)
@@ -2148,12 +2148,9 @@ expand_binop (enum machine_mode mode, op

       insns = get_insns ();
       end_sequence ();
+      emit_insn (insns);

-      target = gen_reg_rtx (mode);
-      emit_libcall_block (insns, target, value,
-                         gen_rtx_fmt_ee (binoptab->code, mode, op0, op1));
-
-      return target;
+      return value;
     }

   delete_insns_since (last);


I'll test forcing value to a register.


-- 


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

Reply via email to