This patch fixes regressions of the gcc.dg/torture/bitint-* tests caused by r16-3036-ga76a032354ee48 with --enable-checking=all.
The errors are similar to the following: ../../gcc/testsuite/gcc.dg/torture/bitint-14.c:54:1: error: type mismatch in 'array_ref' <unnamed-signed:63> unsigned long _42 = VIEW_CONVERT_EXPR<unsigned long[10]>(r575[i_10])[8]; during GIMPLE pass: bitintlower0 ../../gcc/testsuite/gcc.dg/torture/bitint-14.c:54:1: internal compiler error: verify_gimple failed Sorry about this. PR target/117599 gcc/ChangeLog: * gimple-lower-bitint.cc (bitint_large_huge::limb_access): Avoid emitting ARRAY_REF with the wrong element type. --- gcc/gimple-lower-bitint.cc | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc index 1e434ce7a0c..e7ea4984db2 100644 --- a/gcc/gimple-lower-bitint.cc +++ b/gcc/gimple-lower-bitint.cc @@ -651,25 +651,37 @@ bitint_large_huge::limb_access (tree type, tree var, tree idx, bool write_p, else { var = unshare_expr (var); + + /* Build m_limb_type from the right address space. */ + tree limb_type_a = m_limb_type; + if (as != TYPE_ADDR_SPACE (m_limb_type)) + limb_type_a = build_qualified_type (m_limb_type, + TYPE_QUALS (m_limb_type) + | ENCODE_QUAL_ADDR_SPACE (as)); + if (TREE_CODE (TREE_TYPE (var)) != ARRAY_TYPE - || !useless_type_conversion_p (m_limb_type, + || !useless_type_conversion_p (limb_type_a, TREE_TYPE (TREE_TYPE (var)))) { unsigned HOST_WIDE_INT nelts = CEIL (tree_to_uhwi (TYPE_SIZE (TREE_TYPE (var))), limb_prec); - /* Build the array type with m_limb_type from the right address - space. */ - tree limb_type_a = m_limb_type; - if (as != TYPE_ADDR_SPACE (m_limb_type)) - limb_type_a = build_qualified_type (m_limb_type, - TYPE_QUALS (m_limb_type) - | ENCODE_QUAL_ADDR_SPACE (as)); - tree atype = build_array_type_nelts (limb_type_a, nelts); var = build1 (VIEW_CONVERT_EXPR, atype, var); } - ret = build4 (ARRAY_REF, ltype, var, idx, NULL_TREE, NULL_TREE); + + ret = build4 (ARRAY_REF, limb_type_a, var, idx, NULL_TREE, NULL_TREE); + + if (!useless_type_conversion_p (ltype, limb_type_a)) + { + tree base = make_ssa_name (build_pointer_type (limb_type_a)); + gimple *g = gimple_build_assign (base, build_fold_addr_expr (ret)); + insert_before (g); + + tree ptrtype = build_pointer_type (ltype); + ret = build2 (MEM_REF, ltype, add_cast (ptrtype, base), + build_zero_cst (ptrtype)); + } } if (!write_p && !useless_type_conversion_p (atype, ltype)) { -- 2.46.0