https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65235
James Greenhalgh <jgreenhalgh at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target|aarch64 |aarch64*-*-* Status|UNCONFIRMED |NEW Last reconfirmed| |2015-03-02 CC| |jgreenhalgh at gcc dot gnu.org Host| |*-*-* Ever confirmed|0 |1 --- Comment #7 from James Greenhalgh <jgreenhalgh at gcc dot gnu.org> --- The tescase from comment 5 fails for me at -O3 on an aarch64-none-elf cross compiler (r221086), this also fails for native aarch64-none-linux-gnu. As with Kyrill, I see: (insn 16 15 17 2 (set (reg:V2DI 80 [ D.2809 ]) (vec_concat:V2DI (reg:DI 95 [ D.2812 ]) (reg:DI 77 [ D.2806 ]))) reduced.c:19 1386 {aarch64_combine_internaldi} (expr_list:REG_DEAD (reg:DI 95 [ D.2812 ]) (expr_list:REG_DEAD (reg:DI 77 [ D.2806 ]) (expr_list:REG_EQUAL (vec_concat:V2DI (reg:DI 95 [ D.2812 ]) (const_int 4503599627370498 [0x10000000000002])) (nil))))) (insn 17 16 18 2 (set (reg:DI 96 [ D.2806 ]) (vec_select:DI (reg:V2DI 80 [ D.2809 ]) (parallel [ (const_int 0 [0]) ]))) reduced.c:14 1372 {aarch64_get_lanev2di} (expr_list:REG_DEAD (reg:V2DI 80 [ D.2809 ]) (nil))) ---- Combine: Trying 16 -> 17: Successfully matched this instruction: (set (reg:DI 96 [ D.2806 ]) (reg:DI 77 [ D.2806 ])) --- Which is bogus, the correct rewrite would be to: (set (reg:DI 96 [ D.2806 ]) (reg:DI 95 [ D.2812 ]))