diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-12-13 10:23:01 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-12-13 10:23:01 +0000 |
commit | 7b17e51b9ad5916b8df45cf5bedaf1ba81aaa0a2 (patch) | |
tree | 9fdfda59626fff7ba3e443019f6a3d6db94d3421 /gcc | |
parent | df3a8aaaee5b35de7080e8942cc51f261ad87f8e (diff) | |
download | gcc-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.adb | 40 |
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); |