aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.dg/torture/pr47744-3.c
diff options
context:
space:
mode:
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.c74
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;
+ }
+ }
+}