Commit f58e663b by Eric Botcazou Committed by Eric Botcazou

utils.c (rest_of_record_type_compilation): Simplify and robustify pattern…

utils.c (rest_of_record_type_compilation): Simplify and robustify pattern machine code for masking operations.

	* gcc-interface/utils.c (rest_of_record_type_compilation): Simplify and
	robustify pattern machine code for masking operations.

From-SVN: r192672
parent 25eb3455
2012-10-22 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils.c (rest_of_record_type_compilation): Simplify and
robustify pattern machine code for masking operations.
2012-10-22 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Subprogram_Type>: In
type annotation mode, break circularities introduced by AI05-0151.
......
......@@ -1731,19 +1731,23 @@ rest_of_record_type_compilation (tree record_type)
tree offset = TREE_OPERAND (curpos, 0);
align = tree_low_cst (TREE_OPERAND (curpos, 1), 1);
/* An offset which is a bitwise AND with a negative power of 2
means an alignment corresponding to this power of 2. Note
that, as sizetype is sign-extended but nonetheless unsigned,
we don't directly use tree_int_cst_sgn. */
/* An offset which is a bitwise AND with a mask increases the
alignment according to the number of trailing zeros. */
offset = remove_conversions (offset, true);
if (TREE_CODE (offset) == BIT_AND_EXPR
&& host_integerp (TREE_OPERAND (offset, 1), 0)
&& TREE_INT_CST_HIGH (TREE_OPERAND (offset, 1)) < 0)
&& TREE_CODE (TREE_OPERAND (offset, 1)) == INTEGER_CST)
{
unsigned int pow
= - tree_low_cst (TREE_OPERAND (offset, 1), 0);
if (exact_log2 (pow) > 0)
align *= pow;
unsigned HOST_WIDE_INT mask
= TREE_INT_CST_LOW (TREE_OPERAND (offset, 1));
unsigned int i;
for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
{
if (mask & 1)
break;
mask >>= 1;
align *= 2;
}
}
pos = compute_related_constant (curpos,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment