utils2.c (known_alignment): Handle COMPOUND_EXPR, COND_EXPR and BIT_AND_EXPR.
authorOlivier Hainque <hainque@adacore.com>
Fri, 6 Apr 2007 09:28:45 +0000 (11:28 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 6 Apr 2007 09:28:45 +0000 (11:28 +0200)
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

gcc/ada/utils2.c

index 8ad4c68c8672ef0c00a9fbf1d01c2c6f435172d7..4a4bd7d896c7a66189c32b2f3ea2763216df6a6b 100644 (file)
@@ -158,6 +158,7 @@ known_alignment (tree exp)
   switch (TREE_CODE (exp))
     {
     case CONVERT_EXPR:
+    case VIEW_CONVERT_EXPR:
     case NOP_EXPR:
     case NON_LVALUE_EXPR:
       /* Conversions between pointers and integers don't change the alignment
@@ -165,6 +166,11 @@ known_alignment (tree exp)
       this_alignment = known_alignment (TREE_OPERAND (exp, 0));
       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 MINUS_EXPR:
       /* If two address are added, the alignment of the result is the
@@ -174,6 +180,13 @@ known_alignment (tree exp)
       this_alignment = MIN (lhs, rhs);
       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:
       /* The first part of this represents the lowest bit in the constant,
         but is it in bytes, not bits.  */
@@ -195,6 +208,14 @@ known_alignment (tree exp)
        this_alignment = MIN (BIGGEST_ALIGNMENT, lhs * rhs);
       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:
       this_alignment = expr_align (TREE_OPERAND (exp, 0));
       break;