[Bug target/95523] aarch64:ICE in register_tuple_type,at config/aarch64/aarch64-sve-builtins.cc:3434
z.zhanghaijian at huawei dot com
gcc-bugzilla@gcc.gnu.org
Sat Jun 6 07:11:11 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95523
--- Comment #4 from z.zhanghaijian at huawei dot com <z.zhanghaijian at huawei dot com> ---
> Could you try setting DECL_USER_ALIGN on the FIELD_DECL?
> that should (hopefully) force the field to keep its
> natural alignment.
Do you mean to change the alignment to natural alignment when processing
arm_sve.h, and then change it back after handle_arm_sve_h?
I tracked the calculation process of TYPE_ALIGN (tuple_type), which is
determined by maximum_field_alignment in layout_decl, not from DECL_USER_ALIGN.
We can set maximum_field_alignment in sve_switcher to achieve the purpose of
natural alignment.
like:
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc
b/gcc/config/aarch64/aarch64-sve-builtins.cc
index bdb04e8170d..c49fcebcd43 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
@@ -878,6 +878,9 @@ sve_switcher::sve_switcher ()
aarch64_isa_flags = (AARCH64_FL_FP | AARCH64_FL_SIMD | AARCH64_FL_F16
| AARCH64_FL_SVE);
+ m_old_maximum_field_alignment = maximum_field_alignment;
+ maximum_field_alignment = 0;
+
m_old_general_regs_only = TARGET_GENERAL_REGS_ONLY;
global_options.x_target_flags &= ~MASK_GENERAL_REGS_ONLY;
@@ -895,6 +898,7 @@ sve_switcher::~sve_switcher ()
if (m_old_general_regs_only)
global_options.x_target_flags |= MASK_GENERAL_REGS_ONLY;
aarch64_isa_flags = m_old_isa_flags;
+ maximum_field_alignment = m_old_maximum_field_alignment;
}
function_builder::function_builder ()
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.h
b/gcc/config/aarch64/aarch64-sve-builtins.h
index 526d9f55e7b..3ffe2516df9 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.h
+++ b/gcc/config/aarch64/aarch64-sve-builtins.h
@@ -658,6 +658,7 @@ public:
private:
unsigned long m_old_isa_flags;
+ unsigned int m_old_maximum_field_alignment;
bool m_old_general_regs_only;
bool m_old_have_regs_of_mode[MAX_MACHINE_MODE];
};
More information about the Gcc-bugs
mailing list