From: Eric Botcazou Date: Sat, 19 Dec 2020 10:55:29 +0000 (+0100) Subject: [Ada] Fix interaction of 128-bit integer types and -gnato2 mode X-Git-Tag: upstream/12.2.0~8420 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b55ef4b8d6ff7d8d6f290172cdffbb616816f56a;p=platform%2Fupstream%2Fgcc.git [Ada] Fix interaction of 128-bit integer types and -gnato2 mode gcc/ada/ * exp_ch4.adb (Expand_Compare_Minimize_Eliminate_Overflow): Remove entry condition. (Expand_N_In): Call Minimized_Eliminated_Overflow_Check on the left operand before doing the special overflow expansion. (Expand_N_Op_Eq): Likewise. (Expand_N_Op_Ge): Likewise. (Expand_N_Op_Gt): Likewise. (Expand_N_Op_Le): Likewise. (Expand_N_Op_Lt): Likewise. (Expand_N_Op_Ne): Likewise. (Minimized_Eliminated_Overflow_Check): Return False for Minimized if the size of the type is greater than that of Long_Long_Integer. --- diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 04bd1fe..0ca03b1 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -2253,9 +2253,6 @@ package body Exp_Ch4 is LLIB : constant Entity_Id := Base_Type (Standard_Long_Long_Integer); -- Entity for Long_Long_Integer'Base - Check : constant Overflow_Mode_Type := Overflow_Check_Mode; - -- Current overflow checking mode - procedure Set_True; procedure Set_False; -- These procedures rewrite N with an occurrence of Standard_True or @@ -2284,17 +2281,6 @@ package body Exp_Ch4 is -- Start of processing for Expand_Compare_Minimize_Eliminate_Overflow begin - -- Nothing to do unless we have a comparison operator with operands - -- that are signed integer types, and we are operating in either - -- MINIMIZED or ELIMINATED overflow checking mode. - - if Nkind (N) not in N_Op_Compare - or else Check not in Minimized_Or_Eliminated - or else not Is_Signed_Integer_Type (Etype (Left_Opnd (N))) - then - return; - end if; - -- OK, this is the case we are interested in. First step is to process -- our operands using the Minimize_Eliminate circuitry which applies -- this processing to the two operand subtrees. @@ -6425,8 +6411,7 @@ package body Exp_Ch4 is -- type, then expand with a separate procedure. Note the use of the -- flag No_Minimize_Eliminate to prevent infinite recursion. - if Overflow_Check_Mode in Minimized_Or_Eliminated - and then Is_Signed_Integer_Type (Ltyp) + if Minimized_Eliminated_Overflow_Check (Left_Opnd (N)) and then not No_Minimize_Eliminate (N) then Expand_Membership_Minimize_Eliminate_Overflow (N); @@ -8343,7 +8328,9 @@ package body Exp_Ch4 is -- Deal with overflow checks in MINIMIZED/ELIMINATED mode and if that -- means we no longer have a comparison operation, we are all done. - Expand_Compare_Minimize_Eliminate_Overflow (N); + if Minimized_Eliminated_Overflow_Check (Left_Opnd (N)) then + Expand_Compare_Minimize_Eliminate_Overflow (N); + end if; if Nkind (N) /= N_Op_Eq then return; @@ -9201,7 +9188,9 @@ package body Exp_Ch4 is -- Deal with overflow checks in MINIMIZED/ELIMINATED mode and if that -- means we no longer have a comparison operation, we are all done. - Expand_Compare_Minimize_Eliminate_Overflow (N); + if Minimized_Eliminated_Overflow_Check (Op1) then + Expand_Compare_Minimize_Eliminate_Overflow (N); + end if; if Nkind (N) /= N_Op_Ge then return; @@ -9250,7 +9239,9 @@ package body Exp_Ch4 is -- Deal with overflow checks in MINIMIZED/ELIMINATED mode and if that -- means we no longer have a comparison operation, we are all done. - Expand_Compare_Minimize_Eliminate_Overflow (N); + if Minimized_Eliminated_Overflow_Check (Op1) then + Expand_Compare_Minimize_Eliminate_Overflow (N); + end if; if Nkind (N) /= N_Op_Gt then return; @@ -9299,7 +9290,9 @@ package body Exp_Ch4 is -- Deal with overflow checks in MINIMIZED/ELIMINATED mode and if that -- means we no longer have a comparison operation, we are all done. - Expand_Compare_Minimize_Eliminate_Overflow (N); + if Minimized_Eliminated_Overflow_Check (Op1) then + Expand_Compare_Minimize_Eliminate_Overflow (N); + end if; if Nkind (N) /= N_Op_Le then return; @@ -9348,7 +9341,9 @@ package body Exp_Ch4 is -- Deal with overflow checks in MINIMIZED/ELIMINATED mode and if that -- means we no longer have a comparison operation, we are all done. - Expand_Compare_Minimize_Eliminate_Overflow (N); + if Minimized_Eliminated_Overflow_Check (Op1) then + Expand_Compare_Minimize_Eliminate_Overflow (N); + end if; if Nkind (N) /= N_Op_Lt then return; @@ -9942,7 +9937,9 @@ package body Exp_Ch4 is -- Deal with overflow checks in MINIMIZED/ELIMINATED mode and if -- means we no longer have a /= operation, we are all done. - Expand_Compare_Minimize_Eliminate_Overflow (N); + if Minimized_Eliminated_Overflow_Check (Left_Opnd (N)) then + Expand_Compare_Minimize_Eliminate_Overflow (N); + end if; if Nkind (N) /= N_Op_Ne then return; @@ -14114,9 +14111,15 @@ package body Exp_Ch4 is function Minimized_Eliminated_Overflow_Check (N : Node_Id) return Boolean is begin + -- The MINIMIZED mode operates in Long_Long_Integer so we cannot use it + -- if the type of the expression is already larger. + return Is_Signed_Integer_Type (Etype (N)) - and then Overflow_Check_Mode in Minimized_Or_Eliminated; + and then Overflow_Check_Mode in Minimized_Or_Eliminated + and then not (Overflow_Check_Mode = Minimized + and then + Esize (Etype (N)) > Standard_Long_Long_Integer_Size); end Minimized_Eliminated_Overflow_Check; ----------------------------