https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102986
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |sayle at gcc dot gnu.org --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- /* PR target/102986 */ /* { dg-do compile } */ /* { dg-options "-O2" } */ typedef unsigned __int128 __attribute__((__vector_size__ (16))) V; V v; void foo (int x) { v >>= x; } ICEs too. The shift expanders aren't allowed to fail, at least when may_fail isn't set in calls to expand_shift_1, but the new expanders only allow const_int_operand and so ICE if the shift amount is not constant or it is an out of bounds shift (in that case the code earlier forces the shift amount into a register). I guess a way out of this would be to change the predicate from "const_int_operand" to "nonmemory_operand" and if the last operand isn't CONST_INT in ix86_expand_v1ti_shift, subreg the first operand to TImode, expand_variable_shift it (unfortunately with make_tree on the second operand, or instead export expand_shift_1 and use that directly?) and then subreg to V1TImode back.