From 40eafcd83d6ee644ec48985fd5a9696921ea10e7 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Tue, 13 Jun 2023 17:20:31 +0100 Subject: [PATCH] Avoid duplicate vector initializations during RTL expansion. This middle-end patch avoids some redundant RTL for vector initialization during RTL expansion. For the simple test case: typedef __int128 v1ti __attribute__ ((__vector_size__ (16))); __int128 key; v1ti foo() { return (v1ti){key}; } the middle-end currently expands: (set (reg:V1TI 85) (const_vector:V1TI [ (const_int 0) ])) (set (reg:V1TI 85) (mem/c:V1TI (symbol_ref:DI ("key")))) where we create a dead instruction that initializes the vector to zero, immediately followed by a set of the entire vector. This patch skips this zeroing instruction when the vector has only a single element. It also updates the code to indicate when we've cleared the vector, so that we don't need to initialize zero elements. 2023-06-13 Roger Sayle gcc/ChangeLog * expr.cc (store_constructor) : Don't bother clearing vectors with only a single element. Set CLEARED if the vector was initialized to zero. --- gcc/expr.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gcc/expr.cc b/gcc/expr.cc index 868fa6e4ccab..62cd8facf756 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -7531,8 +7531,11 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size, } /* Inform later passes that the old value is dead. */ - if (!cleared && !vector && REG_P (target)) - emit_move_insn (target, CONST0_RTX (mode)); + if (!cleared && !vector && REG_P (target) && maybe_gt (n_elts, 1u)) + { + emit_move_insn (target, CONST0_RTX (mode)); + cleared = 1; + } if (MEM_P (target)) alias = MEM_ALIAS_SET (target); -- 2.47.2