diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/df-problems.cc | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/torture/pr116564.c | 11 |
2 files changed, 16 insertions, 3 deletions
diff --git a/gcc/df-problems.cc b/gcc/df-problems.cc index f32185b..9075379 100644 --- a/gcc/df-problems.cc +++ b/gcc/df-problems.cc @@ -3893,9 +3893,11 @@ df_simulate_defs (rtx_insn *insn, bitmap live) { unsigned int dregno = DF_REF_REGNO (def); - /* If the def is to only part of the reg, it does - not kill the other defs that reach here. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) + /* If the def is to only part of the reg, model it as a RMW operation + by marking it live. It only kills the reg if it is a complete def. */ + if (DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)) + bitmap_set_bit (live, dregno); + else bitmap_clear_bit (live, dregno); } } diff --git a/gcc/testsuite/gcc.target/aarch64/torture/pr116564.c b/gcc/testsuite/gcc.target/aarch64/torture/pr116564.c new file mode 100644 index 0000000..d471e09 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/torture/pr116564.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ +#include <arm_neon.h> +void test() +{ + for (int L = 0; L < 4; ++L) { + float64_t ResData[1 * 2]; + float64x1x2_t Src1; + vst2_f64(ResData, Src1); + } +} |