summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-12-13 10:23:01 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-12-13 10:23:01 +0000
commit7b17e51b9ad5916b8df45cf5bedaf1ba81aaa0a2 (patch)
tree9fdfda59626fff7ba3e443019f6a3d6db94d3421 /gcc
parentdf3a8aaaee5b35de7080e8942cc51f261ad87f8e (diff)
downloadgcc-7b17e51b9ad5916b8df45cf5bedaf1ba81aaa0a2.tar.gz
2007-12-06 Robert Dewar <dewar@adacore.com>
* checks.adb: Fix optimization problem with short-circuited form git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130823 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/checks.adb40
1 files changed, 30 insertions, 10 deletions
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb
index f9f0c1041bf..73955946321 100644
--- a/gcc/ada/checks.adb
+++ b/gcc/ada/checks.adb
@@ -2501,20 +2501,45 @@ package body Checks is
P := Parent (N);
K := Nkind (P);
- if K not in N_Subexpr then
+ -- Done if out of subexpression (note that we allow generated stuff
+ -- such as itype declarations in this context, to keep the loop going
+ -- since we may well have generated such stuff in complex situations.
+ -- Also done if no parent (probably an error condition, but no point
+ -- in behaving nasty if we find it!)
+
+ if No (P)
+ or else (K not in N_Subexpr and then Comes_From_Source (P))
+ then
return True;
- -- Or/Or Else case, left operand must be equality test
+ -- Or/Or Else case, where test is part of the right operand, or is
+ -- part of one of the actions associated with the right operand, and
+ -- the left operand is an equality test.
- elsif K = N_Op_Or or else K = N_Or_Else then
+ elsif K = N_Op_Or then
exit when N = Right_Opnd (P)
and then Nkind (Left_Opnd (P)) = N_Op_Eq;
- -- And/And then case, left operand must be inequality test
+ elsif K = N_Or_Else then
+ exit when (N = Right_Opnd (P)
+ or else
+ (Is_List_Member (N)
+ and then List_Containing (N) = Actions (P)))
+ and then Nkind (Left_Opnd (P)) = N_Op_Eq;
- elsif K = N_Op_And or else K = N_And_Then then
+ -- Similar test for the And/And then case, where the left operand
+ -- is an inequality test.
+
+ elsif K = N_Op_And then
exit when N = Right_Opnd (P)
and then Nkind (Left_Opnd (P)) = N_Op_Ne;
+
+ elsif K = N_And_Then then
+ exit when (N = Right_Opnd (P)
+ or else
+ (Is_List_Member (N)
+ and then List_Containing (N) = Actions (P)))
+ and then Nkind (Left_Opnd (P)) = N_Op_Ne;
end if;
N := P;
@@ -2524,11 +2549,6 @@ package body Checks is
-- appropriate test as its left operand. So test further.
L := Left_Opnd (P);
-
- if Nkind (L) = N_Op_Not then
- L := Right_Opnd (L);
- end if;
-
R := Right_Opnd (L);
L := Left_Opnd (L);