@@ -1769,7 +1769,7 @@ can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn *pred ATTRIBUTE_UNUSED,
{
int i;
const_rtx set = 0;
- rtx src, dest;
+ rtx src, dest, asm_op;
rtx_insn *p;
#ifdef AUTO_INC_DEC
rtx link;
@@ -1983,6 +1983,10 @@ can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn *pred ATTRIBUTE_UNUSED,
else if (GET_CODE (dest) != CC0)
return 0;
+ /* If i3 contains an inline-asm operand, reject, because the user specified
+ registers in the inline-asm maybe removed by the combining. */
+ if ((asm_op = extract_asm_operands (PATTERN (i3))) != NULL)
+ return 0;
if (GET_CODE (PATTERN (i3)) == PARALLEL)
for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
new file mode 100644
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=cortex-m3 -mthumb -O1" } */
+
+char temp[16];
+extern int foo1 (void);
+
+void foo (void)
+{
+ int i;
+ int len;
+
+ while (1)
+ {
+ len = foo1 ();
+ register char *a asm ("r1") = temp;
+ asm volatile ("mov %[r1], %[r1]\n " :: [r1]"r"(a), "m"(*a));
+
+ for (i = 0; i < len; i++)
+ {
+ if (temp[i] == 10)
+ return;
+ }
+ }
+}
+
+/* { dg-final { scan-assembler "\[\\t \]+mov\ r1,\ r1" } } */