Commit fc879b8f by Olivier Hainque Committed by Arnaud Charlet

utils2.c (known_alignment): Handle COMPOUND_EXPR, COND_EXPR and BIT_AND_EXPR.

2007-04-06  Olivier Hainque  <hainque@adacore.com>

	* utils2.c (known_alignment): Handle COMPOUND_EXPR, COND_EXPR and
	BIT_AND_EXPR. Handle also VIEW_CONVERT_EXPR, as the other conversion
	opcodes.

From-SVN: r123604
parent 2e45500e
...@@ -158,6 +158,7 @@ known_alignment (tree exp) ...@@ -158,6 +158,7 @@ known_alignment (tree exp)
switch (TREE_CODE (exp)) switch (TREE_CODE (exp))
{ {
case CONVERT_EXPR: case CONVERT_EXPR:
case VIEW_CONVERT_EXPR:
case NOP_EXPR: case NOP_EXPR:
case NON_LVALUE_EXPR: case NON_LVALUE_EXPR:
/* Conversions between pointers and integers don't change the alignment /* Conversions between pointers and integers don't change the alignment
...@@ -165,6 +166,11 @@ known_alignment (tree exp) ...@@ -165,6 +166,11 @@ known_alignment (tree exp)
this_alignment = known_alignment (TREE_OPERAND (exp, 0)); this_alignment = known_alignment (TREE_OPERAND (exp, 0));
break; break;
case COMPOUND_EXPR:
/* The value of a COMPOUND_EXPR is that of it's second operand. */
this_alignment = known_alignment (TREE_OPERAND (exp, 1));
break;
case PLUS_EXPR: case PLUS_EXPR:
case MINUS_EXPR: case MINUS_EXPR:
/* If two address are added, the alignment of the result is the /* If two address are added, the alignment of the result is the
...@@ -174,6 +180,13 @@ known_alignment (tree exp) ...@@ -174,6 +180,13 @@ known_alignment (tree exp)
this_alignment = MIN (lhs, rhs); this_alignment = MIN (lhs, rhs);
break; break;
case COND_EXPR:
/* If there is a choice between two values, use the smallest one. */
lhs = known_alignment (TREE_OPERAND (exp, 1));
rhs = known_alignment (TREE_OPERAND (exp, 2));
this_alignment = MIN (lhs, rhs);
break;
case INTEGER_CST: case INTEGER_CST:
/* The first part of this represents the lowest bit in the constant, /* The first part of this represents the lowest bit in the constant,
but is it in bytes, not bits. */ but is it in bytes, not bits. */
...@@ -195,6 +208,14 @@ known_alignment (tree exp) ...@@ -195,6 +208,14 @@ known_alignment (tree exp)
this_alignment = MIN (BIGGEST_ALIGNMENT, lhs * rhs); this_alignment = MIN (BIGGEST_ALIGNMENT, lhs * rhs);
break; break;
case BIT_AND_EXPR:
/* A bit-and expression is as aligned as the maximum alignment of the
operands. We typically get here for a complex lhs and a constant
negative power of two on the rhs to force an explicit alignment, so
don't bother looking at the lhs. */
this_alignment = known_alignment (TREE_OPERAND (exp, 1));
break;
case ADDR_EXPR: case ADDR_EXPR:
this_alignment = expr_align (TREE_OPERAND (exp, 0)); this_alignment = expr_align (TREE_OPERAND (exp, 0));
break; break;
......
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