[PATCH, rs6000] Fix PR78695

Bill Schmidt wschmidt@linux.vnet.ibm.com
Sun Dec 11 23:05:00 GMT 2016


Hi Segher, 

This indeed bootstrapped on powerpc64le-unknown-linux-gnu with no
regressions.  Ok for trunk?

Thanks for the review!

Bill

On 12/11/16 3:31 PM, Bill Schmidt wrote:
> Hi Segher,
>
> On 12/11/16 2:00 PM, Segher Boessenkool wrote:
>> Maybe this should use DF_REF_IS_ARTIFICIAL?  Or if that doesn't work,
>> DF_REF_INSN_INFO?
>>
> OK, currently regstrapping the following, which also fixes the problem with
> a non-bootstrap compiler.  Is this ok for trunk if it succeeds?
>
> Thanks,
> Bill
>
>
> [gcc]
>
> 2016-12-11  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>
> 	PR target/78695
> 	* config/rs6000/rs6000.c (find_alignment_op): Discard from
> 	consideration any artificial definition.
>
> [gcc/testsuite]
>
> 2016-12-11  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>
> 	PR target/78695
> 	* gcc.target/powerpc/swaps-stack-protector.c: New test.
>
>
> Index: gcc/config/rs6000/rs6000.c
> ===================================================================
> --- gcc/config/rs6000/rs6000.c	(revision 243506)
> +++ gcc/config/rs6000/rs6000.c	(working copy)
> @@ -41433,6 +41433,12 @@ find_alignment_op (rtx_insn *insn, rtx base_reg)
>        if (!base_def_link || base_def_link->next)
>  	break;
>
> +      /* With stack-protector code enabled, and possibly in other
> +	 circumstances, there may not be an associated insn for 
> +	 the def.  */
> +      if (DF_REF_CLASS (base_def_link->ref) == DF_REF_ARTIFICIAL)
> +	break;
> +
>        rtx_insn *and_insn = DF_REF_INSN (base_def_link->ref);
>        and_operation = alignment_mask (and_insn);
>        if (and_operation != 0)
> Index: gcc/testsuite/gcc.target/powerpc/swaps-stack-protector.c
> ===================================================================
> --- gcc/testsuite/gcc.target/powerpc/swaps-stack-protector.c	(revision 0)
> +++ gcc/testsuite/gcc.target/powerpc/swaps-stack-protector.c	(working copy)
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +/* { dg-options "-fstack-protector -O3" } */
> +
> +/* PR78695: This code used to ICE in rs6000.c:find_alignment_op because
> +   the stack protector address definition isn't associated with an insn.  */
> +
> +void *a();
> +long b() {
> +  char c[1];
> +  char *d = a(), *e = c;
> +  long f = e ? b(e) : 0;
> +  if (f > 54)
> +    f = 1;
> +  while (f--)
> +    *d++ = *e++;
> +}
>



More information about the Gcc-patches mailing list