diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec45c0e8364..dc56f6d6c9f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-03-20 Jakub Jelinek + + PR inline-asm/30505 + * reload1.c (reload): Do invalid ASM checking after + cleanup_subreg_operands. + 2007-03-19 Jeff Law * tree-cfg.c (find_taken_edge): Tighten conditions for diff --git a/gcc/reload1.c b/gcc/reload1.c index 2aad6b0c15a..9a56fc40bd0 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -1173,20 +1173,6 @@ reload (rtx first, int global) { rtx *pnote; - /* Clean up invalid ASMs so that they don't confuse later passes. - See PR 21299. */ - if (asm_noperands (PATTERN (insn)) >= 0) - { - extract_insn (insn); - if (!constrain_operands (1)) - { - error_for_asm (insn, - "% operand has impossible constraints"); - delete_insn (insn); - continue; - } - } - if (CALL_P (insn)) replace_pseudos_in (& CALL_INSN_FUNCTION_USAGE (insn), VOIDmode, CALL_INSN_FUNCTION_USAGE (insn)); @@ -1245,8 +1231,22 @@ reload (rtx first, int global) add_auto_inc_notes (insn, PATTERN (insn)); #endif - /* And simplify (subreg (reg)) if it appears as an operand. */ + /* Simplify (subreg (reg)) if it appears as an operand. */ cleanup_subreg_operands (insn); + + /* Clean up invalid ASMs so that they don't confuse later passes. + See PR 21299. */ + if (asm_noperands (PATTERN (insn)) >= 0) + { + extract_insn (insn); + if (!constrain_operands (1)) + { + error_for_asm (insn, + "% operand has impossible constraints"); + delete_insn (insn); + continue; + } + } } /* If we are doing stack checking, give a warning if this function's diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2ac81780bf8..9a6607f2d11 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-03-20 Jakub Jelinek + + PR inline-asm/30505 + * gcc.target/i386/pr30505.c: New test. + 2007-03-19 Mark Shinwell * gcc.target/arm/register-variables.c: New. diff --git a/gcc/testsuite/gcc.target/i386/pr30505.c b/gcc/testsuite/gcc.target/i386/pr30505.c new file mode 100644 index 00000000000..a3b23685f3d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr30505.c @@ -0,0 +1,19 @@ +/* PR inline-asm/30505 */ +/* { dg-do compile { target ilp32 } } */ +/* { dg-options "-O2" } */ + +unsigned long long a, c; +unsigned int b, d; + +void +test () +{ + unsigned int e, f; + + __asm__ ("divl %5;movl %1, %0;movl %4, %1;divl %5" + : "=&rm" (e), "=a" (f), "=d" (d) + : "1" ((unsigned int) (a >> 32)), "g" ((unsigned int) a), + "rm" (b), "2" (0) + : "cc"); + c = (unsigned long long) e << 32 | f; +}