diff options
author | Dorit Nuzman <dorit@il.ibm.com> | 2007-03-25 11:08:29 +0000 |
---|---|---|
committer | Dorit Nuzman <dorit@gcc.gnu.org> | 2007-03-25 11:08:29 +0000 |
commit | 5773afc5b5b659bc20842e72627b492023d65cb5 (patch) | |
tree | 7b5379e8c48e4e39c5a32337205ad98c5b5e7d24 /gcc/fold-const.c | |
parent | 271892929a448a2bad2fa83e5652958d1af3f1a4 (diff) | |
download | gcc-5773afc5b5b659bc20842e72627b492023d65cb5.zip gcc-5773afc5b5b659bc20842e72627b492023d65cb5.tar.gz gcc-5773afc5b5b659bc20842e72627b492023d65cb5.tar.bz2 |
re PR middle-end/30784 (ICE on loop vectorization (-O1 -march=athlon-xp -ftree-vectorize))
PR tree-optimization/30784
* fold-const.c (fold_ternary): Handle CONSTRUCTOR in case
BIT_FIELD_REF.
From-SVN: r123197
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index e4efda0..66bcbbc 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -12470,7 +12470,8 @@ fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2) gcc_unreachable (); case BIT_FIELD_REF: - if (TREE_CODE (arg0) == VECTOR_CST + if ((TREE_CODE (arg0) == VECTOR_CST + || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0))) && type == TREE_TYPE (TREE_TYPE (arg0)) && host_integerp (arg1, 1) && host_integerp (op2, 1)) @@ -12484,7 +12485,18 @@ fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2) && (idx = idx / width) < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0))) { - tree elements = TREE_VECTOR_CST_ELTS (arg0); + tree elements = NULL_TREE; + + if (TREE_CODE (arg0) == VECTOR_CST) + elements = TREE_VECTOR_CST_ELTS (arg0); + else + { + unsigned HOST_WIDE_INT idx; + tree value; + + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value) + elements = tree_cons (NULL_TREE, value, elements); + } while (idx-- > 0 && elements) elements = TREE_CHAIN (elements); if (elements) |