6.0.0-0.10
This commit is contained in:
parent
2d005021d3
commit
97475d9eac
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
||||
/gcc-6.0.0-20160128.tar.bz2
|
||||
/gcc-6.0.0-20160129.tar.bz2
|
||||
/gcc-6.0.0-20160201.tar.bz2
|
||||
/gcc-6.0.0-20160205.tar.bz2
|
||||
|
60
gcc.spec
60
gcc.spec
@ -1,9 +1,9 @@
|
||||
%global DATE 20160201
|
||||
%global SVNREV 233052
|
||||
%global DATE 20160205
|
||||
%global SVNREV 233185
|
||||
%global gcc_version 6.0.0
|
||||
# Note, gcc_release must be integer, if you want to add suffixes to
|
||||
# %{release}, append them after %{gcc_release} on Release: line.
|
||||
%global gcc_release 0.9
|
||||
%global gcc_release 0.10
|
||||
%global _unpackaged_files_terminate_build 0
|
||||
%global _performance_build 1
|
||||
# Hardening slows the compiler way too much.
|
||||
@ -206,8 +206,11 @@ Patch10: gcc6-no-add-needed.patch
|
||||
Patch11: gcc6-libgo-p224.patch
|
||||
Patch12: gcc6-aarch64-async-unw-tables.patch
|
||||
Patch13: gcc6-libsanitize-aarch64-va42.patch
|
||||
Patch14: gcc6-pr69558.patch
|
||||
Patch15: gcc6-pr69592.patch
|
||||
Patch14: gcc6-pr65932-cse-revert.patch
|
||||
Patch15: gcc6-pr69241.patch
|
||||
Patch16: gcc6-pr69628.patch
|
||||
Patch17: gcc6-pr69658.patch
|
||||
Patch18: gcc6-pr69691.patch
|
||||
|
||||
# On ARM EABI systems, we do want -gnueabi to be part of the
|
||||
# target triple.
|
||||
@ -774,8 +777,11 @@ package or when debugging this package.
|
||||
rm -f libgo/go/crypto/elliptic/p224{,_test}.go
|
||||
%patch12 -p0 -b .aarch64-async-unw-tables~
|
||||
%patch13 -p0 -b .libsanitize-aarch64-va42~
|
||||
%patch14 -p0 -b .pr69558~
|
||||
%patch15 -p0 -b .pr69592~
|
||||
%patch14 -p0 -b .pr65932-cse-revert~
|
||||
%patch15 -p0 -b .pr69241~
|
||||
%patch16 -p0 -b .pr69628~
|
||||
%patch17 -p0 -b .pr69658~
|
||||
%patch18 -p0 -b .pr69691~
|
||||
|
||||
%if 0%{?_enable_debug_packages}
|
||||
mkdir dwz-wrapper
|
||||
@ -835,7 +841,7 @@ if [ -f "${BUILDDIR}"/debugfiles.list \
|
||||
done
|
||||
cp -a "${BUILDDIR}"/debugfiles-base.list "${BUILDDIR}"/debugfiles-remove.list
|
||||
%if %{build_go}
|
||||
libgoso=`basename .%{_prefix}/%{_lib}/libgo.so.8.*`
|
||||
libgoso=`basename .%{_prefix}/%{_lib}/libgo.so.9.*`
|
||||
for f in %{_prefix}/bin/go.gcc \
|
||||
%{_prefix}/bin/gofmt.gcc \
|
||||
%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/cgo \
|
||||
@ -846,8 +852,8 @@ if [ -f "${BUILDDIR}"/debugfiles.list \
|
||||
rm -f usr/lib/debug$f.debug
|
||||
echo "/usr/lib/debug$f.debug" >> "${BUILDDIR}"/debugfiles-remove.list
|
||||
done
|
||||
rm -f usr/lib/debug%{_prefix}/%{_lib}/libgo.so.8.debug
|
||||
echo "/usr/lib/debug%{_prefix}/%{_lib}/libgo.so.8.debug" >> "${BUILDDIR}"/debugfiles-remove.list
|
||||
rm -f usr/lib/debug%{_prefix}/%{_lib}/libgo.so.9.debug
|
||||
echo "/usr/lib/debug%{_prefix}/%{_lib}/libgo.so.9.debug" >> "${BUILDDIR}"/debugfiles-remove.list
|
||||
for f in `find usr/lib/debug/.build-id -type l`; do
|
||||
if ls -l "$f" | egrep -q -- '->.*(/bin/go.gcc|/bin/gofmt.gcc|/cgo|lib[0-9]*/libgo\.so)'; then
|
||||
echo "/$f" >> "${BUILDDIR}"/debugfiles-remove.list
|
||||
@ -1339,7 +1345,7 @@ ln -sf ../../../libstdc++.so.6.*[0-9] libstdc++.so
|
||||
ln -sf ../../../libgfortran.so.3.* libgfortran.so
|
||||
ln -sf ../../../libgomp.so.1.* libgomp.so
|
||||
%if %{build_go}
|
||||
ln -sf ../../../libgo.so.8.* libgo.so
|
||||
ln -sf ../../../libgo.so.9.* libgo.so
|
||||
%endif
|
||||
%if %{build_libquadmath}
|
||||
ln -sf ../../../libquadmath.so.0.* libquadmath.so
|
||||
@ -1370,7 +1376,7 @@ ln -sf ../../../../%{_lib}/libstdc++.so.6.*[0-9] libstdc++.so
|
||||
ln -sf ../../../../%{_lib}/libgfortran.so.3.* libgfortran.so
|
||||
ln -sf ../../../../%{_lib}/libgomp.so.1.* libgomp.so
|
||||
%if %{build_go}
|
||||
ln -sf ../../../../%{_lib}/libgo.so.8.* libgo.so
|
||||
ln -sf ../../../../%{_lib}/libgo.so.9.* libgo.so
|
||||
%endif
|
||||
%if %{build_libquadmath}
|
||||
ln -sf ../../../../%{_lib}/libquadmath.so.0.* libquadmath.so
|
||||
@ -1491,8 +1497,8 @@ ln -sf ../`echo ../../../../lib/libgfortran.so.3.* | sed s~/lib/~/lib64/~` 64/li
|
||||
ln -sf ../`echo ../../../../lib/libgomp.so.1.* | sed s~/lib/~/lib64/~` 64/libgomp.so
|
||||
%if %{build_go}
|
||||
rm -f libgo.so
|
||||
echo 'INPUT ( %{_prefix}/lib/'`echo ../../../../lib/libgo.so.8.* | sed 's,^.*libg,libg,'`' )' > libgo.so
|
||||
echo 'INPUT ( %{_prefix}/lib64/'`echo ../../../../lib/libgo.so.8.* | sed 's,^.*libg,libg,'`' )' > 64/libgo.so
|
||||
echo 'INPUT ( %{_prefix}/lib/'`echo ../../../../lib/libgo.so.9.* | sed 's,^.*libg,libg,'`' )' > libgo.so
|
||||
echo 'INPUT ( %{_prefix}/lib64/'`echo ../../../../lib/libgo.so.9.* | sed 's,^.*libg,libg,'`' )' > 64/libgo.so
|
||||
%endif
|
||||
%if %{build_libquadmath}
|
||||
rm -f libquadmath.so
|
||||
@ -1598,8 +1604,8 @@ ln -sf ../`echo ../../../../lib64/libgfortran.so.3.* | sed s~/../lib64/~/~` 32/l
|
||||
ln -sf ../`echo ../../../../lib64/libgomp.so.1.* | sed s~/../lib64/~/~` 32/libgomp.so
|
||||
%if %{build_go}
|
||||
rm -f libgo.so
|
||||
echo 'INPUT ( %{_prefix}/lib64/'`echo ../../../../lib64/libgo.so.8.* | sed 's,^.*libg,libg,'`' )' > libgo.so
|
||||
echo 'INPUT ( %{_prefix}/lib/'`echo ../../../../lib64/libgo.so.8.* | sed 's,^.*libg,libg,'`' )' > 32/libgo.so
|
||||
echo 'INPUT ( %{_prefix}/lib64/'`echo ../../../../lib64/libgo.so.9.* | sed 's,^.*libg,libg,'`' )' > libgo.so
|
||||
echo 'INPUT ( %{_prefix}/lib/'`echo ../../../../lib64/libgo.so.9.* | sed 's,^.*libg,libg,'`' )' > 32/libgo.so
|
||||
%endif
|
||||
%if %{build_libquadmath}
|
||||
rm -f libquadmath.so
|
||||
@ -1780,7 +1786,7 @@ chmod 755 %{buildroot}%{_prefix}/%{_lib}/libtsan.so.0.*
|
||||
chmod 755 %{buildroot}%{_prefix}/%{_lib}/liblsan.so.0.*
|
||||
%endif
|
||||
%if %{build_go}
|
||||
chmod 755 %{buildroot}%{_prefix}/%{_lib}/libgo.so.8.*
|
||||
chmod 755 %{buildroot}%{_prefix}/%{_lib}/libgo.so.9.*
|
||||
%endif
|
||||
chmod 755 %{buildroot}%{_prefix}/%{_lib}/libobjc.so.4.*
|
||||
|
||||
@ -2982,7 +2988,7 @@ fi
|
||||
%doc rpm.doc/go/*
|
||||
|
||||
%files -n libgo
|
||||
%{_prefix}/%{_lib}/libgo.so.8*
|
||||
%{_prefix}/%{_lib}/libgo.so.9*
|
||||
%doc rpm.doc/libgo/*
|
||||
|
||||
%files -n libgo-devel
|
||||
@ -3068,6 +3074,24 @@ fi
|
||||
%doc rpm.doc/changelogs/libcc1/ChangeLog*
|
||||
|
||||
%changelog
|
||||
* Fri Feb 5 2016 Jakub Jelinek <jakub@redhat.com> 6.0.0-0.10
|
||||
- update from the trunk
|
||||
- PRs bootstrap/69611, bootstrap/69677, c++/68948, c++/69056, c++/69251,
|
||||
c++/69253, c++/69277, c++/69290, c++/69349, c/69627, c/69669,
|
||||
fortran/67451, fortran/69368, fortran/69418, libstdc++/69626,
|
||||
middle-end/68542, rtl-opt/67609, rtl-optimization/64682,
|
||||
rtl-optimization/69567, rtl-optimization/69577, sanitizer/69276,
|
||||
target/65932, target/67032, target/67714, target/68124, target/68662,
|
||||
target/69118, target/69369, target/69454, target/69461, target/69548,
|
||||
target/69619, target/69625, target/69644, target/69667, target/69677,
|
||||
testsuite/65940, tree-optimization/69580, tree-optimization/69595,
|
||||
tree-optimization/69606
|
||||
- Go 1.6rc1
|
||||
- fix various C++ ICEs in assign_temp (PR ipa/69241, PR c++/69649)
|
||||
- fix character constant error recovery (PR c++/69628)
|
||||
- fix invalid diagnostics on C++ array initializers (PR c++/69658)
|
||||
- fix RA subreg handling (PR rtl-optimization/69691)
|
||||
|
||||
* Mon Feb 1 2016 Jakub Jelinek <jakub@redhat.com> 6.0.0-0.9
|
||||
- update from the trunk
|
||||
- PRs middle-end/69556, tree-optimization/67921, tree-optimization/69574
|
||||
|
19
gcc6-pr65932-cse-revert.patch
Normal file
19
gcc6-pr65932-cse-revert.patch
Normal file
@ -0,0 +1,19 @@
|
||||
Revert:
|
||||
2016-02-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
PR target/65932
|
||||
PR target/67714
|
||||
* cse.c (cse_insn): Pass NULL to fold_rtx when initially
|
||||
folding the source of a SET.
|
||||
|
||||
--- gcc/cse.c (revision 233133)
|
||||
+++ gcc/cse.c (revision 233132)
|
||||
@@ -4636,7 +4636,7 @@ cse_insn (rtx_insn *insn)
|
||||
|
||||
/* Simplify and foldable subexpressions in SRC. Then get the fully-
|
||||
simplified result, which may not necessarily be valid. */
|
||||
- src_folded = fold_rtx (src, NULL);
|
||||
+ src_folded = fold_rtx (src, insn);
|
||||
|
||||
#if 0
|
||||
/* ??? This caused bad code to be generated for the m68k port with -O2.
|
163
gcc6-pr69241.patch
Normal file
163
gcc6-pr69241.patch
Normal file
@ -0,0 +1,163 @@
|
||||
2016-02-03 Jakub Jelinek <jakub@redhat.com>
|
||||
Patrick Palka <ppalka@gcc.gnu.org>
|
||||
|
||||
PR ipa/69241
|
||||
PR c++/69649
|
||||
* gimplify.c (gimplify_modify_expr): Set lhs even for noreturn
|
||||
calls if the return type is TREE_ADDRESSABLE.
|
||||
* cgraphunit.c (cgraph_node::expand_thunk): Likewise.
|
||||
* ipa-split.c (split_function): Fix doubled "we" in comment.
|
||||
Use void return type for the split part even if
|
||||
!split_point->split_part_set_retval.
|
||||
|
||||
* g++.dg/ipa/pr69241-1.C: New test.
|
||||
* g++.dg/ipa/pr69241-2.C: New test.
|
||||
* g++.dg/ipa/pr69241-3.C: New test.
|
||||
* g++.dg/ipa/pr69649.C: New test.
|
||||
|
||||
--- gcc/gimplify.c.jj 2016-02-02 20:42:00.000000000 +0100
|
||||
+++ gcc/gimplify.c 2016-02-03 11:04:06.400757668 +0100
|
||||
@@ -4828,7 +4828,8 @@ gimplify_modify_expr (tree *expr_p, gimp
|
||||
}
|
||||
}
|
||||
notice_special_calls (call_stmt);
|
||||
- if (!gimple_call_noreturn_p (call_stmt))
|
||||
+ if (!gimple_call_noreturn_p (call_stmt)
|
||||
+ || TREE_ADDRESSABLE (TREE_TYPE (*to_p)))
|
||||
gimple_call_set_lhs (call_stmt, *to_p);
|
||||
assign = call_stmt;
|
||||
}
|
||||
--- gcc/cgraphunit.c.jj 2016-01-20 10:55:15.000000000 +0100
|
||||
+++ gcc/cgraphunit.c 2016-02-03 11:04:41.034279370 +0100
|
||||
@@ -1703,7 +1703,8 @@ cgraph_node::expand_thunk (bool output_a
|
||||
bsi = gsi_start_bb (bb);
|
||||
|
||||
/* Build call to the function being thunked. */
|
||||
- if (!VOID_TYPE_P (restype) && !alias_is_noreturn)
|
||||
+ if (!VOID_TYPE_P (restype)
|
||||
+ && (!alias_is_noreturn || TREE_ADDRESSABLE (restype)))
|
||||
{
|
||||
if (DECL_BY_REFERENCE (resdecl))
|
||||
{
|
||||
@@ -1770,7 +1771,7 @@ cgraph_node::expand_thunk (bool output_a
|
||||
|| DECL_BY_REFERENCE (resdecl)))
|
||||
gimple_call_set_return_slot_opt (call, true);
|
||||
|
||||
- if (restmp && !alias_is_noreturn)
|
||||
+ if (restmp)
|
||||
{
|
||||
gimple_call_set_lhs (call, restmp);
|
||||
gcc_assert (useless_type_conversion_p (TREE_TYPE (restmp),
|
||||
--- gcc/ipa-split.c.jj 2016-01-04 14:55:52.000000000 +0100
|
||||
+++ gcc/ipa-split.c 2016-02-03 13:01:45.905136051 +0100
|
||||
@@ -1254,7 +1254,7 @@ split_function (basic_block return_bb, s
|
||||
else
|
||||
main_part_return_p = true;
|
||||
}
|
||||
- /* The main part also returns if we we split on a fallthru edge
|
||||
+ /* The main part also returns if we split on a fallthru edge
|
||||
and the split part returns. */
|
||||
if (split_part_return_p)
|
||||
FOR_EACH_EDGE (e, ei, split_point->entry_bb->preds)
|
||||
@@ -1364,8 +1364,9 @@ split_function (basic_block return_bb, s
|
||||
/* Now create the actual clone. */
|
||||
cgraph_edge::rebuild_edges ();
|
||||
node = cur_node->create_version_clone_with_body
|
||||
- (vNULL, NULL, args_to_skip, !split_part_return_p, split_point->split_bbs,
|
||||
- split_point->entry_bb, "part");
|
||||
+ (vNULL, NULL, args_to_skip,
|
||||
+ !split_part_return_p || !split_point->split_part_set_retval,
|
||||
+ split_point->split_bbs, split_point->entry_bb, "part");
|
||||
|
||||
node->split_part = true;
|
||||
|
||||
--- gcc/testsuite/g++.dg/ipa/pr69241-1.C.jj 2016-02-03 10:56:10.624328263 +0100
|
||||
+++ gcc/testsuite/g++.dg/ipa/pr69241-1.C 2016-02-03 11:01:18.600075039 +0100
|
||||
@@ -0,0 +1,12 @@
|
||||
+// PR ipa/69241
|
||||
+// { dg-do compile }
|
||||
+// { dg-options "-O2" }
|
||||
+
|
||||
+struct R { R (const R &) {} };
|
||||
+__attribute__ ((noreturn)) R bar ();
|
||||
+
|
||||
+R
|
||||
+foo ()
|
||||
+{
|
||||
+ bar ();
|
||||
+}
|
||||
--- gcc/testsuite/g++.dg/ipa/pr69241-2.C.jj 2016-02-03 10:56:07.996364556 +0100
|
||||
+++ gcc/testsuite/g++.dg/ipa/pr69241-2.C 2016-02-03 11:01:42.958738639 +0100
|
||||
@@ -0,0 +1,18 @@
|
||||
+// PR ipa/69241
|
||||
+// { dg-do compile }
|
||||
+// { dg-options "-O2" }
|
||||
+
|
||||
+__attribute__((noreturn)) void foo (int);
|
||||
+struct R { R (const R &) {} };
|
||||
+
|
||||
+R
|
||||
+bar ()
|
||||
+{
|
||||
+ foo (0);
|
||||
+}
|
||||
+
|
||||
+R
|
||||
+baz ()
|
||||
+{
|
||||
+ foo (0);
|
||||
+}
|
||||
--- gcc/testsuite/g++.dg/ipa/pr69241-3.C.jj 2016-02-03 11:00:39.840610317 +0100
|
||||
+++ gcc/testsuite/g++.dg/ipa/pr69241-3.C 2016-02-03 11:01:02.044303678 +0100
|
||||
@@ -0,0 +1,12 @@
|
||||
+// PR ipa/69241
|
||||
+// { dg-do compile }
|
||||
+// { dg-options "-O2" }
|
||||
+
|
||||
+struct R { int x[100]; };
|
||||
+__attribute__ ((noreturn)) R bar ();
|
||||
+
|
||||
+void
|
||||
+foo ()
|
||||
+{
|
||||
+ bar ();
|
||||
+}
|
||||
--- gcc/testsuite/g++.dg/ipa/pr69649.C.jj 2016-02-03 13:19:00.850845887 +0100
|
||||
+++ gcc/testsuite/g++.dg/ipa/pr69649.C 2016-02-03 13:18:43.000000000 +0100
|
||||
@@ -0,0 +1,36 @@
|
||||
+// PR c++/69649
|
||||
+// { dg-do compile }
|
||||
+// { dg-options "-O2" }
|
||||
+
|
||||
+struct A { virtual void m1 (); };
|
||||
+struct C : A { void m1 () { m1 (); } };
|
||||
+template <class T> struct B
|
||||
+{
|
||||
+ T *t;
|
||||
+ B (T *x) : t (x) { if (t) t->m1 (); }
|
||||
+ B (const B &);
|
||||
+};
|
||||
+struct D : public C {};
|
||||
+struct F : public D
|
||||
+{
|
||||
+ virtual B<D> m2 ();
|
||||
+ virtual B<D> m3 ();
|
||||
+ int m4 ();
|
||||
+};
|
||||
+struct G : F
|
||||
+{
|
||||
+ B<D> m2 ();
|
||||
+ B<D> m3 ();
|
||||
+};
|
||||
+B<D> G::m2 ()
|
||||
+{
|
||||
+ if (m4 () == 0)
|
||||
+ return this;
|
||||
+ return 0;
|
||||
+}
|
||||
+B<D> G::m3 ()
|
||||
+{
|
||||
+ if (m4 () == 0)
|
||||
+ return this;
|
||||
+ return 0;
|
||||
+}
|
@ -1,62 +0,0 @@
|
||||
2016-01-29 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR preprocessor/69543
|
||||
PR c/69558
|
||||
* c-pragma.c (handle_pragma_diagnostic): Pass input_location
|
||||
instead of loc to control_warning_option.
|
||||
|
||||
* gcc.dg/pr69543.c: New test.
|
||||
* gcc.dg/pr69558.c: New test.
|
||||
|
||||
--- gcc/c-family/c-pragma.c.jj 2016-01-15 21:57:00.000000000 +0100
|
||||
+++ gcc/c-family/c-pragma.c 2016-01-29 18:34:51.743943283 +0100
|
||||
@@ -819,7 +819,7 @@ handle_pragma_diagnostic(cpp_reader *ARG
|
||||
arg = option_string + 1 + cl_options[option_index].opt_len;
|
||||
control_warning_option (option_index, (int) kind,
|
||||
arg, kind != DK_IGNORED,
|
||||
- loc, lang_mask, &handlers,
|
||||
+ input_location, lang_mask, &handlers,
|
||||
&global_options, &global_options_set,
|
||||
global_dc);
|
||||
}
|
||||
--- gcc/testsuite/gcc.dg/pr69558.c.jj 2016-01-29 18:43:32.191665058 +0100
|
||||
+++ gcc/testsuite/gcc.dg/pr69558.c 2016-01-29 18:40:05.000000000 +0100
|
||||
@@ -0,0 +1,17 @@
|
||||
+/* PR c/69558 */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-Wdeprecated-declarations" } */
|
||||
+
|
||||
+#define A \
|
||||
+ _Pragma ("GCC diagnostic push") \
|
||||
+ _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
|
||||
+#define B \
|
||||
+ _Pragma ("GCC diagnostic pop")
|
||||
+#define C(x) \
|
||||
+ A \
|
||||
+ static inline void bar (void) { x (); } \
|
||||
+ B
|
||||
+
|
||||
+__attribute__((deprecated)) void foo (void); /* { dg-bogus "declared here" } */
|
||||
+
|
||||
+C (foo) /* { dg-bogus "is deprecated" } */
|
||||
--- gcc/testsuite/gcc.dg/pr69543.c.jj 2016-01-29 18:45:09.520323395 +0100
|
||||
+++ gcc/testsuite/gcc.dg/pr69543.c 2016-01-29 18:44:56.000000000 +0100
|
||||
@@ -0,0 +1,18 @@
|
||||
+/* PR preprocessor/69543 */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -Wuninitialized" } */
|
||||
+
|
||||
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
|
||||
+ _Pragma ("GCC diagnostic push") \
|
||||
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
|
||||
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
|
||||
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
|
||||
+ _Pragma ("GCC diagnostic pop")
|
||||
+
|
||||
+void test (char yylval)
|
||||
+{
|
||||
+ char *yyvsp;
|
||||
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
|
||||
+ *++yyvsp = yylval;
|
||||
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
|
||||
+}
|
@ -1,154 +0,0 @@
|
||||
2016-02-01 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/69592
|
||||
* rtlanal.c (nonzero_bits_binary_arith_p): New inline function.
|
||||
(cached_nonzero_bits): Use it instead of ARITHMETIC_P.
|
||||
(num_sign_bit_copies_binary_arith_p): New inline function.
|
||||
(cached_num_sign_bit_copies): Use it instead of ARITHMETIC_P.
|
||||
|
||||
* gcc.dg/pr69592.c: New test.
|
||||
|
||||
--- gcc/rtlanal.c.jj 2016-01-21 21:27:57.000000000 +0100
|
||||
+++ gcc/rtlanal.c 2016-02-01 18:53:06.130934333 +0100
|
||||
@@ -4163,6 +4163,36 @@ num_sign_bit_copies (const_rtx x, machin
|
||||
return cached_num_sign_bit_copies (x, mode, NULL_RTX, VOIDmode, 0);
|
||||
}
|
||||
|
||||
+/* Return true if nonzero_bits1 might recurse into both operands
|
||||
+ of X. */
|
||||
+
|
||||
+static inline bool
|
||||
+nonzero_bits_binary_arith_p (const_rtx x)
|
||||
+{
|
||||
+ if (!ARITHMETIC_P (x))
|
||||
+ return false;
|
||||
+ switch (GET_CODE (x))
|
||||
+ {
|
||||
+ case AND:
|
||||
+ case XOR:
|
||||
+ case IOR:
|
||||
+ case UMIN:
|
||||
+ case UMAX:
|
||||
+ case SMIN:
|
||||
+ case SMAX:
|
||||
+ case PLUS:
|
||||
+ case MINUS:
|
||||
+ case MULT:
|
||||
+ case DIV:
|
||||
+ case UDIV:
|
||||
+ case MOD:
|
||||
+ case UMOD:
|
||||
+ return true;
|
||||
+ default:
|
||||
+ return false;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* The function cached_nonzero_bits is a wrapper around nonzero_bits1.
|
||||
It avoids exponential behavior in nonzero_bits1 when X has
|
||||
identical subexpressions on the first or the second level. */
|
||||
@@ -4179,7 +4209,7 @@ cached_nonzero_bits (const_rtx x, machin
|
||||
nonzero_bits1 on X with the subexpressions as KNOWN_X and the
|
||||
precomputed value for the subexpression as KNOWN_RET. */
|
||||
|
||||
- if (ARITHMETIC_P (x))
|
||||
+ if (nonzero_bits_binary_arith_p (x))
|
||||
{
|
||||
rtx x0 = XEXP (x, 0);
|
||||
rtx x1 = XEXP (x, 1);
|
||||
@@ -4191,13 +4221,13 @@ cached_nonzero_bits (const_rtx x, machin
|
||||
known_mode, known_ret));
|
||||
|
||||
/* Check the second level. */
|
||||
- if (ARITHMETIC_P (x0)
|
||||
+ if (nonzero_bits_binary_arith_p (x0)
|
||||
&& (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
|
||||
return nonzero_bits1 (x, mode, x1, mode,
|
||||
cached_nonzero_bits (x1, mode, known_x,
|
||||
known_mode, known_ret));
|
||||
|
||||
- if (ARITHMETIC_P (x1)
|
||||
+ if (nonzero_bits_binary_arith_p (x1)
|
||||
&& (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
|
||||
return nonzero_bits1 (x, mode, x0, mode,
|
||||
cached_nonzero_bits (x0, mode, known_x,
|
||||
@@ -4672,6 +4702,33 @@ nonzero_bits1 (const_rtx x, machine_mode
|
||||
#undef cached_num_sign_bit_copies
|
||||
|
||||
|
||||
+/* Return true if num_sign_bit_copies1 might recurse into both operands
|
||||
+ of X. */
|
||||
+
|
||||
+static inline bool
|
||||
+num_sign_bit_copies_binary_arith_p (const_rtx x)
|
||||
+{
|
||||
+ if (!ARITHMETIC_P (x))
|
||||
+ return false;
|
||||
+ switch (GET_CODE (x))
|
||||
+ {
|
||||
+ case IOR:
|
||||
+ case AND:
|
||||
+ case XOR:
|
||||
+ case SMIN:
|
||||
+ case SMAX:
|
||||
+ case UMIN:
|
||||
+ case UMAX:
|
||||
+ case PLUS:
|
||||
+ case MINUS:
|
||||
+ case MULT:
|
||||
+ return true;
|
||||
+ default:
|
||||
+ return false;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+
|
||||
/* The function cached_num_sign_bit_copies is a wrapper around
|
||||
num_sign_bit_copies1. It avoids exponential behavior in
|
||||
num_sign_bit_copies1 when X has identical subexpressions on the
|
||||
@@ -4689,7 +4746,7 @@ cached_num_sign_bit_copies (const_rtx x,
|
||||
num_sign_bit_copies1 on X with the subexpressions as KNOWN_X and
|
||||
the precomputed value for the subexpression as KNOWN_RET. */
|
||||
|
||||
- if (ARITHMETIC_P (x))
|
||||
+ if (num_sign_bit_copies_binary_arith_p (x))
|
||||
{
|
||||
rtx x0 = XEXP (x, 0);
|
||||
rtx x1 = XEXP (x, 1);
|
||||
@@ -4703,7 +4760,7 @@ cached_num_sign_bit_copies (const_rtx x,
|
||||
known_ret));
|
||||
|
||||
/* Check the second level. */
|
||||
- if (ARITHMETIC_P (x0)
|
||||
+ if (num_sign_bit_copies_binary_arith_p (x0)
|
||||
&& (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
|
||||
return
|
||||
num_sign_bit_copies1 (x, mode, x1, mode,
|
||||
@@ -4711,7 +4768,7 @@ cached_num_sign_bit_copies (const_rtx x,
|
||||
known_mode,
|
||||
known_ret));
|
||||
|
||||
- if (ARITHMETIC_P (x1)
|
||||
+ if (num_sign_bit_copies_binary_arith_p (x1)
|
||||
&& (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
|
||||
return
|
||||
num_sign_bit_copies1 (x, mode, x0, mode,
|
||||
--- gcc/testsuite/gcc.dg/pr69592.c.jj 2016-02-01 19:02:23.122251761 +0100
|
||||
+++ gcc/testsuite/gcc.dg/pr69592.c 2016-02-01 19:00:30.000000000 +0100
|
||||
@@ -0,0 +1,16 @@
|
||||
+/* PR rtl-optimization/69592 */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2" } */
|
||||
+
|
||||
+unsigned int
|
||||
+foo (unsigned int a, unsigned int *b, unsigned int c)
|
||||
+{
|
||||
+ unsigned int d;
|
||||
+#define A(n) d = a + b[n]; if (d < a) c++; a = d;
|
||||
+#define B(n) A(n##0) A(n##1) A(n##2) A(n##3) A(n##4) A(n##5) A(n##6) A(n##7) A(n##8) A(n##9)
|
||||
+#define C(n) B(n##0) B(n##1) B(n##2) B(n##3) B(n##4) B(n##5) B(n##6) B(n##7) B(n##8) B(n##9)
|
||||
+#define D(n) C(n##0) C(n##1) C(n##2) C(n##3) C(n##4) C(n##5) C(n##6) C(n##7) C(n##8) C(n##9)
|
||||
+#define E(n) D(n##0) D(n##1) D(n##2) D(n##3) D(n##4) D(n##5) D(n##6) D(n##7) D(n##8) D(n##9)
|
||||
+ C(1) C(2) C(3) C(4) C(5) C(6)
|
||||
+ return d + c;
|
||||
+}
|
38
gcc6-pr69628.patch
Normal file
38
gcc6-pr69628.patch
Normal file
@ -0,0 +1,38 @@
|
||||
2016-02-03 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/69628
|
||||
* charset.c (cpp_interpret_charconst): Clear *PCHARS_SEEN
|
||||
and *UNSIGNEDP if bailing out early due to errors.
|
||||
|
||||
* g++.dg/parse/pr69628.C: New test.
|
||||
|
||||
--- libcpp/charset.c.jj 2016-01-04 15:14:08.000000000 +0100
|
||||
+++ libcpp/charset.c 2016-02-03 13:44:05.100120898 +0100
|
||||
@@ -1620,10 +1620,17 @@ cpp_interpret_charconst (cpp_reader *pfi
|
||||
if (token->val.str.len == (size_t) (2 + wide + u8))
|
||||
{
|
||||
cpp_error (pfile, CPP_DL_ERROR, "empty character constant");
|
||||
+ *pchars_seen = 0;
|
||||
+ *unsignedp = 0;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ else if (!cpp_interpret_string (pfile, &token->val.str, 1, &str,
|
||||
+ token->type))
|
||||
+ {
|
||||
+ *pchars_seen = 0;
|
||||
+ *unsignedp = 0;
|
||||
return 0;
|
||||
}
|
||||
- else if (!cpp_interpret_string (pfile, &token->val.str, 1, &str, token->type))
|
||||
- return 0;
|
||||
|
||||
if (wide)
|
||||
result = wide_str_to_charconst (pfile, str, pchars_seen, unsignedp,
|
||||
--- gcc/testsuite/g++.dg/parse/pr69628.C.jj 2016-02-03 13:47:55.300061110 +0100
|
||||
+++ gcc/testsuite/g++.dg/parse/pr69628.C 2016-02-03 13:47:32.000000000 +0100
|
||||
@@ -0,0 +1,5 @@
|
||||
+// PR c++/69628
|
||||
+// { dg-do compile }
|
||||
+
|
||||
+0''; // { dg-error "empty character constant" }
|
||||
+// { dg-error "expected unqualified-id before numeric constant" "" { target *-*-* } 4 }
|
41
gcc6-pr69658.patch
Normal file
41
gcc6-pr69658.patch
Normal file
@ -0,0 +1,41 @@
|
||||
2016-02-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/69658
|
||||
* init.c (expand_default_init): Only call reshape_init
|
||||
in the direct-initialization from an initializer list case.
|
||||
|
||||
* g++.dg/init/pr69658.C: New test.
|
||||
|
||||
--- gcc/cp/init.c.jj 2016-01-29 12:12:46.000000000 +0100
|
||||
+++ gcc/cp/init.c 2016-02-04 18:53:26.865318337 +0100
|
||||
@@ -1636,16 +1636,17 @@ expand_default_init (tree binfo, tree tr
|
||||
gcc_checking_assert ((flags & LOOKUP_ONLYCONVERTING) == 0
|
||||
&& TREE_CHAIN (init) == NULL_TREE);
|
||||
init = TREE_VALUE (init);
|
||||
+ /* Only call reshape_init if it has not been called earlier
|
||||
+ by the callers. */
|
||||
+ if (BRACE_ENCLOSED_INITIALIZER_P (init) && CP_AGGREGATE_TYPE_P (type))
|
||||
+ init = reshape_init (type, init, complain);
|
||||
}
|
||||
|
||||
if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
|
||||
&& CP_AGGREGATE_TYPE_P (type))
|
||||
/* A brace-enclosed initializer for an aggregate. In C++0x this can
|
||||
happen for direct-initialization, too. */
|
||||
- {
|
||||
- init = reshape_init (type, init, complain);
|
||||
- init = digest_init (type, init, complain);
|
||||
- }
|
||||
+ init = digest_init (type, init, complain);
|
||||
|
||||
/* A CONSTRUCTOR of the target's type is a previously digested
|
||||
initializer, whether that happened just above or in
|
||||
--- gcc/testsuite/g++.dg/init/pr69658.C.jj 2016-02-04 18:55:46.862390961 +0100
|
||||
+++ gcc/testsuite/g++.dg/init/pr69658.C 2016-02-04 18:54:58.000000000 +0100
|
||||
@@ -0,0 +1,6 @@
|
||||
+// PR c++/69658
|
||||
+// { dg-do compile }
|
||||
+
|
||||
+struct S { S (int); };
|
||||
+struct T { char n[6]; S s; };
|
||||
+T t[1] = { { "foo", 1 } }; // { dg-bogus "C99 designator" }
|
149
gcc6-pr69691.patch
Normal file
149
gcc6-pr69691.patch
Normal file
@ -0,0 +1,149 @@
|
||||
2016-02-05 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/69691
|
||||
* lra-eliminations.c (move_plus_up): Don't add the addend twice.
|
||||
|
||||
* gcc.c-torture/execute/pr69691.c: New test.
|
||||
|
||||
--- gcc/lra-eliminations.c.jj 2016-01-14 20:57:03.000000000 +0100
|
||||
+++ gcc/lra-eliminations.c 2016-02-05 16:54:42.142004224 +0100
|
||||
@@ -303,7 +303,8 @@ move_plus_up (rtx x)
|
||||
subreg_lowpart_offset (x_mode,
|
||||
subreg_reg_mode));
|
||||
if (cst && CONSTANT_P (cst))
|
||||
- return gen_rtx_PLUS (x_mode, lowpart_subreg (x_mode, subreg_reg,
|
||||
+ return gen_rtx_PLUS (x_mode, lowpart_subreg (x_mode,
|
||||
+ XEXP (subreg_reg, 0),
|
||||
subreg_reg_mode), cst);
|
||||
}
|
||||
return x;
|
||||
--- gcc/testsuite/gcc.c-torture/execute/pr69691.c.jj 2016-02-05 17:08:31.582557031 +0100
|
||||
+++ gcc/testsuite/gcc.c-torture/execute/pr69691.c 2016-02-05 17:08:24.000000000 +0100
|
||||
@@ -0,0 +1,127 @@
|
||||
+/* PR rtl-optimization/69691 */
|
||||
+
|
||||
+char u[] = { 46, 97, 99, 104, 52, 0 };
|
||||
+char *v[] = { u, 0 };
|
||||
+struct S { char a[10]; struct S *b[31]; };
|
||||
+struct S r[7], *r2 = r;
|
||||
+static struct S *w = 0;
|
||||
+
|
||||
+__attribute__((noinline, noclone)) int
|
||||
+fn (int x)
|
||||
+{
|
||||
+ if (__builtin_strchr (u, x) || x == 96)
|
||||
+ return x;
|
||||
+ __builtin_abort ();
|
||||
+}
|
||||
+
|
||||
+__attribute__((noinline, noclone)) int
|
||||
+foo (char x)
|
||||
+{
|
||||
+ if (x == 0)
|
||||
+ __builtin_abort ();
|
||||
+ if (fn (x) >= 96 && fn (x) <= 122)
|
||||
+ return (fn (x) - 96);
|
||||
+ else if (x == 46)
|
||||
+ return 0;
|
||||
+ else
|
||||
+ {
|
||||
+ __builtin_printf ("foo %d\n", x);
|
||||
+ return -1;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+__attribute__((noinline, noclone)) void
|
||||
+bar (char **x)
|
||||
+{
|
||||
+ char **b, c, *d, e[500], *f, g[10];
|
||||
+ int z, l, h, i;
|
||||
+ struct S *s;
|
||||
+
|
||||
+ w = r2++;
|
||||
+ for (b = x; *b; b++)
|
||||
+ {
|
||||
+ __builtin_strcpy (e, *b);
|
||||
+ f = e;
|
||||
+ do
|
||||
+ {
|
||||
+ d = __builtin_strchr (f, 32);
|
||||
+ if (d)
|
||||
+ *d = 0;
|
||||
+ l = __builtin_strlen (f);
|
||||
+ h = 0;
|
||||
+ s = w;
|
||||
+ __builtin_memset (g, 0, sizeof (g));
|
||||
+ for (z = 0; z < l; z++)
|
||||
+ {
|
||||
+ c = f[z];
|
||||
+ if (c >= 48 && c <= 57)
|
||||
+ g[h] = c - 48;
|
||||
+ else
|
||||
+ {
|
||||
+ i = foo (c);
|
||||
+ if (!s->b[i])
|
||||
+ {
|
||||
+ s->b[i] = r2++;
|
||||
+ if (r2 == &r[7])
|
||||
+ __builtin_abort ();
|
||||
+ }
|
||||
+ s = s->b[i];
|
||||
+ h++;
|
||||
+ }
|
||||
+ }
|
||||
+ __builtin_memcpy (s->a, g, 10);
|
||||
+ if (d)
|
||||
+ f = d + 1;
|
||||
+ }
|
||||
+ while (d);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+__attribute__((noinline, noclone)) void
|
||||
+baz (char *x)
|
||||
+{
|
||||
+ char a[300], b[300];
|
||||
+ int z, y, t, l;
|
||||
+ struct S *s;
|
||||
+
|
||||
+ l = __builtin_strlen (x);
|
||||
+ *a = 96;
|
||||
+ for (z = 0; z < l; z++)
|
||||
+ {
|
||||
+ a[z + 1] = fn ((unsigned int) x[z]);
|
||||
+ if (foo (a[z + 1]) <= 0)
|
||||
+ return;
|
||||
+ }
|
||||
+ a[l + 1] = 96;
|
||||
+ l += 2;
|
||||
+ __builtin_memset (b, 0, l + 2);
|
||||
+
|
||||
+ if (!w)
|
||||
+ return;
|
||||
+
|
||||
+ for (z = 0; z < l; z++)
|
||||
+ {
|
||||
+ s = w;
|
||||
+ for (y = z; y < l; y++)
|
||||
+ {
|
||||
+ s = s->b[foo (a[y])];
|
||||
+ if (!s)
|
||||
+ break;
|
||||
+ for (t = 0; t <= y - z + 2; t++)
|
||||
+ if (s->a[t] > b[z + t])
|
||||
+ b[z + t] = s->a[t];
|
||||
+ }
|
||||
+ }
|
||||
+ for (z = 3; z < l - 2; z++)
|
||||
+ if ((b[z] & 1) == 1)
|
||||
+ asm ("");
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main ()
|
||||
+{
|
||||
+ bar (v);
|
||||
+ char c[] = { 97, 97, 97, 97, 97, 0 };
|
||||
+ baz (c);
|
||||
+ return 0;
|
||||
+}
|
Loading…
Reference in New Issue
Block a user