[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#871514: gcc-7: miscompiles stack spills on mips64el



Control: tags -1 patch

Hi,

On 23/08/17 17:42, James Cowgill wrote:
> This bug is very closely related to an earlier GCC bootstrap failure on
> mips64el: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78660
> In comment 17 Matthew sent a patch and applying it also fixes this bug.
> However, he tells me it has some other issues and isn't suitable to be
> applied (which is presumably why it was reverted).

Matthew has now had a better look at the bug and has posted a patch to
fix it which is a tweaked version of the patch above:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81803#c9

I've done some testing, and it seems to solve all the known package
failures (at least the ones on my list) caused by this bug and I haven't
noticed any failures with it. I also tested it on armhf and it causes no
regressions there (this was one of the issues with the earlier patch).

So I think the attached debdiff should be applied to gcc-7. Currently
the patch is applied everywhere, but if you want you could limit it to
mips64el.

Thanks,
James
diff -u gcc-7-7.2.0/debian/rules.patch gcc-7-7.2.0/debian/rules.patch
--- gcc-7-7.2.0/debian/rules.patch
+++ gcc-7-7.2.0/debian/rules.patch
@@ -72,6 +72,7 @@
 	gcc-fuse-ld-lld \
 	libgo-s390x-default-isa \
 	pr81829 \
+	gcc-mips64-stack-spilling \
 
 
 #	$(if $(filter yes, $(DEB_CROSS)),,gcc-print-file-name) \
only in patch2:
unchanged:
--- gcc-7-7.2.0.orig/debian/patches/gcc-mips64-stack-spilling.diff
+++ gcc-7-7.2.0/debian/patches/gcc-mips64-stack-spilling.diff
@@ -0,0 +1,16 @@
+--- a/src/gcc/lra-constraints.c
++++ b/src/gcc/lra-constraints.c
+@@ -4235,7 +4235,12 @@ curr_insn_transform (bool check_only_p)
+ 			  && (goal_alt[i] == NO_REGS
+ 			      || (simplify_subreg_regno
+ 				  (ira_class_hard_regs[goal_alt[i]][0],
+-				   GET_MODE (reg), byte, mode) >= 0)))))
++				   GET_MODE (reg), byte, mode) >= 0))))
++		      || (type != OP_IN
++			  && GET_MODE_PRECISION (mode)
++			  < GET_MODE_PRECISION (GET_MODE (reg))
++			  && GET_MODE_SIZE (GET_MODE (reg)) <= UNITS_PER_WORD
++			  && WORD_REGISTER_OPERATIONS))
+ 		{
+ 		  /* An OP_INOUT is required when reloading a subreg of a
+ 		     mode wider than a word to ensure that data beyond the

Attachment: signature.asc
Description: OpenPGP digital signature


Reply to: