Commit 0f64d96d by Alan Modra Committed by Jeff Law

re PR target/88777 (Out-of-range offsets building glibc test-tgmath2.c for hppa-linux-gnu)

	PR 88777
	PR 88614
	* genattrtab.c (min_fn): Don't translate values.
	(min_attr_value): Return INT_MAX when the value can't be calculated.
	Return minimum among any values that can be calculated.
	(max_attr_value): Adjust.

From-SVN: r267851
parent e173500e
2019-01-11 Alan Modra <amodra@gmail.com>
PR 88777
PR 88614
* genattrtab.c (min_fn): Don't translate values.
(min_attr_value): Return INT_MAX when the value can't be calculated.
Return minimum among any values that can be calculated.
(max_attr_value): Adjust.
2019-01-11 Jakub Jelinek <jakub@redhat.com> 2019-01-11 Jakub Jelinek <jakub@redhat.com>
* Makefile.in (PLUGIN_HEADERS): Add $(INSN_ATTR_H). * Makefile.in (PLUGIN_HEADERS): Add $(INSN_ATTR_H).
......
...@@ -1556,10 +1556,7 @@ max_fn (rtx exp) ...@@ -1556,10 +1556,7 @@ max_fn (rtx exp)
static rtx static rtx
min_fn (rtx exp) min_fn (rtx exp)
{ {
int val = min_attr_value (exp); return make_numeric_value (min_attr_value (exp));
if (val < 0)
val = INT_MAX;
return make_numeric_value (val);
} }
static void static void
...@@ -3786,11 +3783,10 @@ max_attr_value (rtx exp) ...@@ -3786,11 +3783,10 @@ max_attr_value (rtx exp)
current_max = max_attr_value (XEXP (exp, 0)); current_max = max_attr_value (XEXP (exp, 0));
if (current_max != INT_MAX) if (current_max != INT_MAX)
{ {
n = min_attr_value (XEXP (exp, 1)); n = current_max;
if (n == INT_MIN) current_max = min_attr_value (XEXP (exp, 1));
current_max = INT_MAX; if (current_max != INT_MAX)
else current_max = n - current_max;
current_max -= n;
} }
break; break;
...@@ -3831,8 +3827,11 @@ max_attr_value (rtx exp) ...@@ -3831,8 +3827,11 @@ max_attr_value (rtx exp)
} }
/* Given an attribute value expression, return the minimum value that /* Given an attribute value expression, return the minimum value that
might be evaluated. Return INT_MIN if the value can't be might be evaluated. Return INT_MAX if the value can't be
calculated by this function. */ calculated by this function. Note that when this function can
calculate one value inside IF_THEN_ELSE or some but not all values
inside COND, then it returns the minimum among those values it can
calculate. */
static int static int
min_attr_value (rtx exp) min_attr_value (rtx exp)
...@@ -3852,34 +3851,33 @@ min_attr_value (rtx exp) ...@@ -3852,34 +3851,33 @@ min_attr_value (rtx exp)
case PLUS: case PLUS:
current_min = min_attr_value (XEXP (exp, 0)); current_min = min_attr_value (XEXP (exp, 0));
if (current_min != INT_MIN) if (current_min != INT_MAX)
{ {
n = current_min; n = current_min;
current_min = min_attr_value (XEXP (exp, 1)); current_min = min_attr_value (XEXP (exp, 1));
if (current_min != INT_MIN) if (current_min != INT_MAX)
current_min += n; current_min += n;
} }
break; break;
case MINUS: case MINUS:
current_min = min_attr_value (XEXP (exp, 0)); current_min = min_attr_value (XEXP (exp, 0));
if (current_min != INT_MIN) if (current_min != INT_MAX)
{ {
n = max_attr_value (XEXP (exp, 1)); n = current_min;
if (n == INT_MAX) current_min = max_attr_value (XEXP (exp, 1));
current_min = INT_MIN; if (current_min != INT_MAX)
else current_min = n - current_min;
current_min -= n;
} }
break; break;
case MULT: case MULT:
current_min = min_attr_value (XEXP (exp, 0)); current_min = min_attr_value (XEXP (exp, 0));
if (current_min != INT_MIN) if (current_min != INT_MAX)
{ {
n = current_min; n = current_min;
current_min = min_attr_value (XEXP (exp, 1)); current_min = min_attr_value (XEXP (exp, 1));
if (current_min != INT_MIN) if (current_min != INT_MAX)
current_min *= n; current_min *= n;
} }
break; break;
...@@ -3902,7 +3900,7 @@ min_attr_value (rtx exp) ...@@ -3902,7 +3900,7 @@ min_attr_value (rtx exp)
break; break;
default: default:
current_min = INT_MIN; current_min = INT_MAX;
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment