Hi, PR71778 is an ICE when you pass a non-constant argument to an intrinsic which requires a constant. This ICE was introduced after we rewrote some of the builtin handling for Neon intrinsics, the issue is that after throwing an error in arm_expand_builtin_args, we return const0_rtx to indicate the expand has failed if (!(*insn_data[icode].operand[opno].predicate) (op[argc], mode[argc])) { error ("%Kargument %d must be a constant immediate", exp, argc + 1); return const0_rtx; } At this point we're safely in to invalid code, but the mid-end continues trying to resolve the assignment, with const0_rtx on the right-hand side. That gets in to trouble in movv2di, which sees the constant and tries to expand through neon_make_constant, which doesn't expect to see a const0_rtx in the assignment (it wants a vector), and we hit a gcc_unreachable () and take the ICE. There are a few moving parts in the back end, so it isn't clear to me that the fix I've come up with is 100% in the right place. AArch64 doesn't bother with a similar construct, expanding straight to a mov with whatever you've given it, so I don't see a right place over there. The change is defensible, but I don't really know the ARM back end. Bootstrapped on arm-none-linux-gnueabihf. OK? Thanks, James --- gcc/ 2017-06-12 James Greenhalgh PR target/71778 * config/arm/arm.c (neon_make_constant): Return const0_rtx for const0_rtx input. gcc/testsuite/ 2017-06-12 James Greenhalgh PR target/71778 * gcc.target/arm/pr71778.c: New.