diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.dg/torture/pr47744-3.c')
-rw-r--r-- | gcc-4.9/gcc/testsuite/gcc.dg/torture/pr47744-3.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.dg/torture/pr47744-3.c b/gcc-4.9/gcc/testsuite/gcc.dg/torture/pr47744-3.c new file mode 100644 index 000000000..5a5dd33e9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/gcc.dg/torture/pr47744-3.c @@ -0,0 +1,74 @@ +/* { dg-do compile } */ + +typedef union rtunion_def { + struct rtx_def *rtx; +} rtunion; +typedef struct rtx_def { + unsigned short code; + rtunion fld[1]; +} *rtx; +extern rtx recog_operand[]; +extern rtx *recog_operand_loc[]; +extern int reload_n_operands; +extern void find_dummy_reload (int, int); +extern int asm_noperands (rtx); +extern int n_occurrences (char **); +char operands_match[10][10]; +void find_reloads (rtx insn, int n_alternatives, int commutative) +{ + register int i, j; + int noperands; + char *constraints[10]; + int address_reloaded[10]; + int this_alternative[10]; + char this_alternative_win[10]; + int this_alternative_matches[10]; + int this_alternative_number; + rtx body = ((insn)->fld[3].rtx); + int operand_mode[10]; + if (body->code == 1) + { + reload_n_operands = noperands = asm_noperands (body); + n_alternatives = n_occurrences (constraints); + } + for (this_alternative_number = 0; + this_alternative_number < n_alternatives; + this_alternative_number++) + for (i = 0; + i < noperands; + i++) + { + register char *p = constraints[i]; + register int win = 0; + int badop = 1; + int c; + register rtx operand = recog_operand[i]; + int force_reload = 0; + this_alternative_win[i] = 0; + this_alternative[i] = 1; + while (*p && (c = *p++) != ',') + switch (c) + { + case '4': + c -= '0'; + this_alternative_matches[i] = c; + if ((c != commutative + || i != commutative + 1) + && operands_match[c][i]) + win = this_alternative_win[c]; + else + find_dummy_reload (operand_mode[i], this_alternative[c]); + if (! win || force_reload) + for (j = 0; j < i; j++) + if (this_alternative_matches[j] + == this_alternative_matches[i]) + badop = 1; + break; + case '<': + if (operand->code == 2 + && ! address_reloaded[i] + && operand->fld[0].rtx->code == 3) + win = 1; + } + } +} |