And
--- gcc/expr.cc.jj 2024-01-12 10:07:58.194851657 +0100
+++ gcc/expr.cc 2024-01-18 12:08:16.412147569 +0100
@@ -12382,6 +12382,21 @@ expand_expr_real_1 (tree exp, rtx target
}
}
+ /* Ensure non-BLKmode array VAR_DECLs VCEd to BLKmode BITINT_TYPE
+ aren't promoted to registers. */
+ if (op0 == NULL_RTX
+ && mode == BLKmode
+ && TREE_CODE (type) == BITINT_TYPE
+ && modifier == EXPAND_NORMAL
+ && VAR_P (treeop0)
+ && DECL_MODE (treeop0) != BLKmode)
+ {
+ op0 = expand_expr_real (treeop0, NULL_RTX, VOIDmode, EXPAND_MEMORY,
+ NULL, inner_reference_p);
+ if (MEM_P (op0))
+ op0 = adjust_address (op0, BLKmode, 0);
+ }
+
if (!op0)
op0 = expand_expr_real (treeop0, NULL_RTX, VOIDmode, modifier,
NULL, inner_reference_p);
helps at -O0, but doesn't at -O2, where even EXPAND_MEMORY doesn't actually
cause MEM_P result, it is still forced into a REG.
Jakub