Eliminate false DVs on parallel compares.

This commit is contained in:
Timothy Wall
2000-09-14 21:37:04 +00:00
parent 74d1c347e9
commit 7484b8e6d9
5 changed files with 123 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2000-09-14 Timothy Wall <twall@cygnus.com>
* config/tc-ia64.c (specify_resource): For PR%/PR63, note types of
parallel comparisons for later use.
(struct rsrc): Add parallel comparison type.
(resources_match): Skip special cases of PR usage (non-conflicting
parallel compares).
2000-09-13 Kazu Hirata <kazu@hxi.com>
* config/obj-ecoff.c: Fix formatting.

View File

@ -521,6 +521,7 @@ static struct rsrc {
char *file; /* what file marked this dependency */
int line; /* what line marked this dependency */
struct mem_offset mem_offset; /* optional memory offset hint */
enum { CMP_NONE, CMP_OR, CMP_AND } cmp_type; /* OR or AND compare? */
int path; /* corresponding code entry index */
} *regdeps = NULL;
static int regdepslen = 0;
@ -528,6 +529,7 @@ static int regdepstotlen = 0;
static const char *dv_mode[] = { "RAW", "WAW", "WAR" };
static const char *dv_sem[] = { "none", "implied", "impliedf",
"data", "instr", "specific", "other" };
static const char *dv_cmp_type[] = { "none", "OR", "AND" };
/* Current state of PR mutexation */
static struct qpmutex {
@ -6374,6 +6376,7 @@ specify_resource (dep, idesc, type, specs, note, path)
tmpl.mem_offset.hint = 0;
tmpl.specific = 1;
tmpl.index = 0;
tmpl.cmp_type = CMP_NONE;
#define UNHANDLED \
as_warn (_("Unhandled dependency %s for %s (%s), note %d"), \
@ -7008,11 +7011,16 @@ dep->name, idesc->name, (rsrc_write?"write":"read"), note)
{
int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
int or_andcm = strstr(idesc->name, "or.andcm") != NULL;
int and_orcm = strstr(idesc->name, "and.orcm") != NULL;
if ((idesc->operands[0] == IA64_OPND_P1
|| idesc->operands[0] == IA64_OPND_P2)
&& p1 != 0 && p1 != 63)
{
specs[count] = tmpl;
specs[count].cmp_type =
(or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
specs[count++].index = p1;
}
if ((idesc->operands[1] == IA64_OPND_P1
@ -7020,6 +7028,8 @@ dep->name, idesc->name, (rsrc_write?"write":"read"), note)
&& p2 != 0 && p2 != 63)
{
specs[count] = tmpl;
specs[count].cmp_type =
(or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
specs[count++].index = p2;
}
}
@ -7462,12 +7472,26 @@ dep->name, idesc->name, (rsrc_write?"write":"read"), note)
{
if (rsrc_write)
{
for (i = 0; i < idesc->num_outputs; i++)
if ((idesc->operands[i] == IA64_OPND_P1
|| idesc->operands[i] == IA64_OPND_P2)
&& CURR_SLOT.opnd[i].X_add_number - REG_P == 63)
int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
int or_andcm = strstr(idesc->name, "or.andcm") != NULL;
int and_orcm = strstr(idesc->name, "and.orcm") != NULL;
if (p1 == 63
&& (idesc->operands[0] == IA64_OPND_P1
|| idesc->operands[0] == IA64_OPND_P2))
{
specs[count++] = tmpl;
specs[count] = tmpl;
specs[count++].cmp_type =
(or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
}
if (p2 == 63
&& (idesc->operands[1] == IA64_OPND_P1
|| idesc->operands[1] == IA64_OPND_P2))
{
specs[count] = tmpl;
specs[count++].cmp_type =
(or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
}
}
else
@ -7951,6 +7975,32 @@ resources_match (rs, idesc, note, qp_regno, path)
}
}
/* Skip apparent PR write conflicts where both writes are an AND or both
writes are an OR. */
if (rs->dependency->specifier == IA64_RS_PR
|| rs->dependency->specifier == IA64_RS_PR63)
{
if (specs[count].cmp_type != CMP_NONE
&& specs[count].cmp_type == rs->cmp_type)
{
if (md.debug_dv)
fprintf (stderr, " %s on parallel compare allowed (PR%d)\n",
dv_mode[rs->dependency->mode],
rs->dependency->specifier == IA64_RS_PR ?
specs[count].index : 63);
continue;
}
if (md.debug_dv)
fprintf (stderr,
" %s on parallel compare conflict %s vs %s on PR%d\n",
dv_mode[rs->dependency->mode],
dv_cmp_type[rs->cmp_type],
dv_cmp_type[specs[count].cmp_type],
rs->dependency->specifier == IA64_RS_PR ?
specs[count].index : 63);
}
/* If either resource is not specific, conservatively assume a conflict
*/
if (!specs[count].specific || !rs->specific)

View File

@ -1,3 +1,8 @@
2000-09-14 Timothy Wall <twall@cygnus.com>
* gas/ia64/dv-waw-err.[sl]: Additional tests for parallel
comparisons which should and should not produce DVs.
2000-09-05 Alan Modra <alan@linuxcare.com.au>
* gas/vtable/vtable.exp: Re-enable for hppa-elf.

View File

@ -351,3 +351,27 @@
.*:507: Warning: This is the location of the conflicting usage
.*:513: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\), specific resource number is 7
.*:512: Warning: This is the location of the conflicting usage
.*:537: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 7
.*:536: Warning: This is the location of the conflicting usage
.*:537: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 6
.*:536: Warning: This is the location of the conflicting usage
.*:537: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 7
.*:536: Warning: This is the location of the conflicting usage
.*:537: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 6
.*:536: Warning: This is the location of the conflicting usage
.*:540: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 7
.*:539: Warning: This is the location of the conflicting usage
.*:540: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 7
.*:539: Warning: This is the location of the conflicting usage
.*:540: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR63' \(impliedf\)
.*:539: Warning: This is the location of the conflicting usage
.*:540: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR63' \(impliedf\)
.*:539: Warning: This is the location of the conflicting usage
.*:543: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 6
.*:542: Warning: This is the location of the conflicting usage
.*:543: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 6
.*:542: Warning: This is the location of the conflicting usage
.*:543: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR63' \(impliedf\)
.*:542: Warning: This is the location of the conflicting usage
.*:543: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR63' \(impliedf\)
.*:542: Warning: This is the location of the conflicting usage

View File

@ -513,4 +513,33 @@
mov rr[r2] = r3
;;
// RSE
// PR, additional cases (or.andcm and and.orcm interaction)
cmp.eq.or.andcm p6, p7 = 1, r32
cmp.eq.or.andcm p6, p7 = 5, r36 // no DV here
;;
cmp.eq.and.orcm p6, p7 = 1, r32
cmp.eq.and.orcm p6, p7 = 5, r36 // no DV here
;;
cmp.eq.or.andcm p63, p7 = 1, r32
cmp.eq.or.andcm p63, p7 = 5, r36 // no DV here
;;
cmp.eq.or.andcm p6, p63 = 1, r32
cmp.eq.or.andcm p6, p63 = 5, r36 // no DV here
;;
cmp.eq.and.orcm p63, p7 = 1, r32
cmp.eq.and.orcm p63, p7 = 5, r36 // no DV here
;;
cmp.eq.and.orcm p6, p63 = 1, r32
cmp.eq.and.orcm p6, p63 = 5, r36 // no DV here
;;
cmp.eq.or.andcm p6, p7 = 1, r32
cmp.eq.and.orcm p6, p7 = 5, r36
;;
cmp.eq.or.andcm p63, p7 = 1, r32
cmp.eq.and.orcm p63, p7 = 5, r36
;;
cmp.eq.or.andcm p6, p63 = 1, r32
cmp.eq.and.orcm p6, p63 = 5, r36
;;
L: