diff options
author | Kazu Hirata <kazu@cs.umass.edu> | 2005-04-15 01:29:44 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@gcc.gnu.org> | 2005-04-15 01:29:44 +0000 |
commit | 417ac4e6c704d8a7477e4c04dc7887314fd593d4 (patch) | |
tree | 105fac8a18c342aa79c155e087c4d213b2c5e7dd /gcc/tree-vrp.c | |
parent | 6f4dfa2bdfb9db6f3cbcb99aaa73402f81771abe (diff) | |
download | gcc-417ac4e6c704d8a7477e4c04dc7887314fd593d4.zip gcc-417ac4e6c704d8a7477e4c04dc7887314fd593d4.tar.gz gcc-417ac4e6c704d8a7477e4c04dc7887314fd593d4.tar.bz2 |
re PR tree-optimization/21021 (ICE in tree-vrp building glibc)
gcc/
PR tree-optimization/21021
* tree-vrp.c (compare_values): Work around a bug in the front
end that produces a comparison of mismatched types.
testsuite/
PR tree-optimization/21021
* gcc.c-torture/compile/pr21021.c: New.
From-SVN: r98161
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 014f195..41cf6e1 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -287,7 +287,13 @@ compare_values (tree val1, tree val2) return 0; /* Do some limited symbolic comparisons. */ - if (!POINTER_TYPE_P (TREE_TYPE (val1))) + /* FIXME: The second check of POINTER_TYPE_P should not be necessary + because we should be comparing values of the same type here, but + for whatever reason, the front end throws us a type mismatched + comparison. For now, work around the problem by checking both + types. See PR 21021 and PR 21024. */ + if (!POINTER_TYPE_P (TREE_TYPE (val1)) + && !POINTER_TYPE_P (TREE_TYPE (val2))) { /* We can determine some comparisons against +INF and -INF even if the other value is an expression. */ @@ -400,7 +406,13 @@ compare_values (tree val1, tree val2) if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2)) return -2; - if (!POINTER_TYPE_P (TREE_TYPE (val1))) + /* FIXME: The second check of POINTER_TYPE_P should not be necessary + because we should be comparing values of the same type here, but + for whatever reason, the front end throws us a type mismatched + comparison. For now, work around the problem by checking both + types. See PR 21021 and PR 21024. */ + if (!POINTER_TYPE_P (TREE_TYPE (val1)) + && !POINTER_TYPE_P (TREE_TYPE (val2))) return tree_int_cst_compare (val1, val2); else { |