I was just testing the patch below which runs into latent issues when
building libjava (at least)...
/space/rguenther/src/svn/trunk/libjava/java/lang/natClassLoader.cc: In
function ‘java::lang::Class* _Jv_FindClassInCache(_Jv_Utf8Const*)’:
/space/rguenther/src/svn/trunk/libjava/java/lang/natClassLoader.cc:97:1:
error:BB 3 last statement has incorrectly set lp
_Jv_FindClassInCache (_Jv_Utf8Const *name)
^
/space/rguenther/src/svn/trunk/libjava/java/lang/natClassLoader.cc:97:1:
internal compiler error: verify_flow_info failed
0x8e2132 verify_flow_info()
/space/rguenther/src/svn/trunk/gcc/cfghooks.c:261
so I have to debug that first. Still IMHO the patch makes sense apart
from the ugly need to go through a INTEGER_CST tree when converting
a wide_int to a widest_int (ugh). Any wide-int folks around that
can suggest something better here (reason: the two integers we compare
do not have to have the same type/precision - see tree_int_cst_lt
which also uses widest_ints).
Richard.
2015-07-10 Richard Biener <[email protected]>
* tree-eh.c (in_array_bounds_p): Use value-range information
when available.
Index: gcc/tree-eh.c
===================================================================
--- gcc/tree-eh.c (revision 225655)
+++ gcc/tree-eh.c (working copy)
@@ -2532,8 +2532,11 @@ in_array_bounds_p (tree ref)
{
tree idx = TREE_OPERAND (ref, 1);
tree min, max;
+ wide_int idx_min, idx_max;
- if (TREE_CODE (idx) != INTEGER_CST)
+ if (TREE_CODE (idx) != INTEGER_CST
+ && (TREE_CODE (idx) != SSA_NAME
+ || get_range_info (idx, &idx_min, &idx_max) != VR_RANGE))
return false;
min = array_ref_low_bound (ref);
@@ -2544,11 +2547,26 @@ in_array_bounds_p (tree ref)
|| TREE_CODE (max) != INTEGER_CST)
return false;
- if (tree_int_cst_lt (idx, min)
- || tree_int_cst_lt (max, idx))
- return false;
+ if (TREE_CODE (idx) == INTEGER_CST)
+ {
+ if (tree_int_cst_lt (idx, min)
+ || tree_int_cst_lt (max, idx))
+ return false;
+
+ return true;
+ }
+ else
+ {
+ if (wi::lts_p (wi::to_widest (wide_int_to_tree (TREE_TYPE (idx),
+ idx_min)),
+ wi::to_widest (min))
+ || wi::lts_p (wi::to_widest (max),
+ wi::to_widest (wide_int_to_tree (TREE_TYPE (idx),
+ idx_max))))
+ return false;
- return true;
+ return true;
+ }
}
/* Returns true if it is possible to prove that the range of