On Tue, Jan 09, 2018 at 12:22:38PM -0600, Peter Bergner wrote:
> PR83399 shows a problem where we emit an altivec load using a builtin
> that forces us to use a specific altivec load pattern.  The generated
> rtl pattern has a use of sfp (frame pointer) and during LRA, we eliminate
> it's use to the sp (lra-eliminations.c:process_insn_for_elimination).
> During this process, we re-recog the insn and end up matching a different
> vsx pattern, because it exists earlier in the machine description file.
> That vsx pattern uses a "Z" constraint for its address operand, which will
> not accept the "special" altivec address we have, but the memory_operand
> predicate the pattern uses allows it.  The recog'ing to a different pattern
> than we want, causes us to ICE later on.
> 
> The solution here is to tighten the predicate used for the address in the
> vsx pattern to use the indexed_or_indirect_operand instead, which will
> reject the altivec address our rtl pattern has.
> 
> Once this is fixed, we end up hitting another issue in print_operand when
> outputing altivec addresses when using -mvsx.  This was fixed by allowing
> both ALTIVEC or VSX VECTOR MEMs.
> 
> This passed bootstrap and regtesting on powerpc64le-linux with no regressions.
> Ok for trunk?
> 
> Is this ok for the open release branches too, once testing has completed 
> there?
> 
> Peter
> 
> 
> gcc/
>       PR target/83399
>       * config/rs6000/rs6000.c (print_operand): Use
>       VECTOR_MEM_ALTIVEC_OR_VSX_P.

(print_operand) <'y'>: ...

>       * config/rs6000/vsx.md (*vsx_le_perm_load_<mode><VSX_D>): Use
>       indexed_or_indirect_operand predicate.

It's *vsx_le_perm_load_<mode> -- <VSX_D> is not part of the name.  It
makes sense to mention it, maybe like
        * config/rs6000/vsx.md (*vsx_le_perm_load_<mode> for VSX_D): ...

>       (*vsx_le_perm_load_<mode><VSX_W>): Likewise.

Similar.

>       (*vsx_le_perm_load_v8hi): Likewise.
>       (*vsx_le_perm_load_v8hi): Likewise.

You duplicated this line.

>       (*vsx_le_perm_load_v16qi): Likewise.
>       (*vsx_le_perm_store_<mode><VSX_D>): Likewise in pattern and splitters.
>       (*vsx_le_perm_store_<mode><VSX_W>): Likewise.

Same for these two.

>       (*vsx_le_perm_store_v8hi): Likewise.
>       (*vsx_le_perm_store_v16qi): Likewise.
> 
> gcc/testsuite/
>       PR target/83399
>       * gcc.target/powerpc/pr83399.c: New test.

>  (define_split
> -  [(set (match_operand:VSX_D 0 "memory_operand" "")
> +  [(set (match_operand:VSX_D 0 "indexed_or_indirect_operand" "")
>          (match_operand:VSX_D 1 "vsx_register_operand" ""))]
>    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && !reload_completed"
>    [(set (match_dup 2)
> @@ -570,7 +570,7 @@ (define_split
>  ;; The post-reload split requires that we re-permute the source
>  ;; register in case it is still live.
>  (define_split
> -  [(set (match_operand:VSX_D 0 "memory_operand" "")
> +  [(set (match_operand:VSX_D 0 "indexed_or_indirect_operand" "")
>          (match_operand:VSX_D 1 "vsx_register_operand" ""))]
>    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && reload_completed"
>    [(set (match_dup 1)

You don't mention these in the changelog.

>  (define_split
> -  [(set (match_operand:VSX_W 0 "memory_operand" "")
> +  [(set (match_operand:VSX_W 0 "indexed_or_indirect_operand" "")
>          (match_operand:VSX_W 1 "vsx_register_operand" ""))]
>    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && !reload_completed"
>    [(set (match_dup 2)
> @@ -617,7 +617,7 @@ (define_split
>  ;; The post-reload split requires that we re-permute the source
>  ;; register in case it is still live.
>  (define_split
> -  [(set (match_operand:VSX_W 0 "memory_operand" "")
> +  [(set (match_operand:VSX_W 0 "indexed_or_indirect_operand" "")
>          (match_operand:VSX_W 1 "vsx_register_operand" ""))]
>    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && reload_completed"
>    [(set (match_dup 1)
> @@ -638,7 +638,7 @@ (define_split
>    "")

Or these.

>  (define_split
> -  [(set (match_operand:V8HI 0 "memory_operand" "")
> +  [(set (match_operand:V8HI 0 "indexed_or_indirect_operand" "")
>          (match_operand:V8HI 1 "vsx_register_operand" ""))]
>    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && !reload_completed"
>    [(set (match_dup 2)
> @@ -671,7 +671,7 @@ (define_split
>  ;; The post-reload split requires that we re-permute the source
>  ;; register in case it is still live.
>  (define_split
> -  [(set (match_operand:V8HI 0 "memory_operand" "")
> +  [(set (match_operand:V8HI 0 "indexed_or_indirect_operand" "")
>          (match_operand:V8HI 1 "vsx_register_operand" ""))]
>    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && reload_completed"
>    [(set (match_dup 1)

Or these.

>  (define_split
> -  [(set (match_operand:V16QI 0 "memory_operand" "")
> +  [(set (match_operand:V16QI 0 "indexed_or_indirect_operand" "")
>          (match_operand:V16QI 1 "vsx_register_operand" ""))]
>    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && !reload_completed"
>    [(set (match_dup 2)
> @@ -739,7 +739,7 @@ (define_split
>  ;; The post-reload split requires that we re-permute the source
>  ;; register in case it is still live.
>  (define_split
> -  [(set (match_operand:V16QI 0 "memory_operand" "")
> +  [(set (match_operand:V16QI 0 "indexed_or_indirect_operand" "")
>          (match_operand:V16QI 1 "vsx_register_operand" ""))]
>    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && reload_completed"
>    [(set (match_dup 1)

And more :-)

Please fix up the changelog.  The patch is fine :-)  Okay for trunk, and
okay for the branches after the usual wait.  Thanks!


Segher

Reply via email to