------- Comment #4 from suckfish at ihug dot co dot nz 2008-10-14 07:17 ------- Digging a bit, in combine.c, the ASHIFTRT case of force_to_mode() contains two calls to simplify_shift_const(). Disabling those for vector modes fixes the test case here (patch below).
But I suspect this is just the tip of the iceberg; there are probably many other arithmetic simplifications here that will get incorrectly applied to vector types, especially when sizeof(vector type) <= sizeof (HOST_WIDE_INT). Do we need to audit the whole compiler for such things, or is there a sensible place we can insert a don't-optimise-vector-types test with disabling too many useful optimisations? Thinking that the test-suite probably contains many more tests for 128 bit vector types, would it be possible/worth-while to build a compiler & run the test-suite with HOST_WIDE_INT being 128 bits? diff --git a/gcc/combine.c b/gcc/combine.c index 5821301..ad24d94 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7635,7 +7635,8 @@ nonzero >>= INTVAL (XEXP (x, 1)); } - if ((mask & ~nonzero) == 0) + if ((mask & ~nonzero) == 0 + && !VECTOR_MODE_P (mode) && !VECTOR_MODE_P (GET_MODE (x))) { x = simplify_shift_const (NULL_RTX, LSHIFTRT, GET_MODE (x), XEXP (x, 0), INTVAL (XEXP (x, 1))); @@ -7643,7 +7644,8 @@ return force_to_mode (x, mode, mask, next_select); } - else if ((i = exact_log2 (mask)) >= 0) + else if ((i = exact_log2 (mask)) >= 0 + && !VECTOR_MODE_P (mode) && !VECTOR_MODE_P (GET_MODE (x))) { x = simplify_shift_const (NULL_RTX, LSHIFTRT, GET_MODE (x), XEXP (x, 0), -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37809