summaryrefslogtreecommitdiff
path: root/gcc/fwprop.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-07-12 08:56:14 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-07-12 08:56:14 +0000
commit712a93d637f8f49194b756d5ea8eb51d4de66608 (patch)
treef56347f8c8d0b7fbfa050d2666f224d5c7a5511b /gcc/fwprop.c
parent7c61b47f177e9b8268cb9d3008574c021fd4464c (diff)
re PR tree-optimization/68961 (Test case gcc.target/powerpc/pr60203.c fails since r231674)
2016-07-12 Richard Biener <rguenther@suse.de> PR rtl-optimization/68961 * fwprop.c (propagate_rtx): Allow SUBREGs of VEC_CONCAT and CONCAT to simplify to a non-constant. * gcc.target/i386/pr68961.c: New testcase. From-SVN: r238238
Diffstat (limited to 'gcc/fwprop.c')
-rw-r--r--gcc/fwprop.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/fwprop.c b/gcc/fwprop.c
index 7834bca7f51..88cfefbe1ef 100644
--- a/gcc/fwprop.c
+++ b/gcc/fwprop.c
@@ -619,6 +619,15 @@ propagate_rtx_1 (rtx *px, rtx old_rtx, rtx new_rtx, int flags)
*px = tem;
+ /* Allow replacements that simplify operations on a vector or complex
+ value to a component. The most prominent case is
+ (subreg ([vec_]concat ...)). */
+ if (REG_P (tem) && !HARD_REGISTER_P (tem)
+ && (VECTOR_MODE_P (GET_MODE (new_rtx))
+ || COMPLEX_MODE_P (GET_MODE (new_rtx)))
+ && GET_MODE (tem) == GET_MODE_INNER (GET_MODE (new_rtx)))
+ return true;
+
/* The replacement we made so far is valid, if all of the recursive
replacements were valid, or we could simplify everything to
a constant. */