Fix multiple_of_p behavior with NOP_EXPR

Message ID 20220124144629.3DE1213BA5@imap2.suse-dmz.suse.de
State Committed
Commit 625f16c798757dcbfdded841f01d7c566d15c55c
Headers
Series Fix multiple_of_p behavior with NOP_EXPR |

Commit Message

Richard Biener Jan. 24, 2022, 2:46 p.m. UTC
  We were passing down the original type to recursive invocations
of multiple_of_p for say (int)(unsigned * unsigned).

Bootstrap and regtest pending on x86_64-unknown-linux-gnu.

2022-01-24  Richard Biener  <rguenther@suse.de>

	* fold-const.cc (multiple_of_p): Pass the correct type of
	the expression to the recursive invocation of multiple_of_p
	for conversions and use CASE_CONVERT.
---
 gcc/fold-const.cc | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
  

Comments

Jeff Law Jan. 28, 2022, 6:06 p.m. UTC | #1
On 1/24/2022 7:46 AM, Richard Biener via Gcc-patches wrote:
> We were passing down the original type to recursive invocations
> of multiple_of_p for say (int)(unsigned * unsigned).
>
> Bootstrap and regtest pending on x86_64-unknown-linux-gnu.
>
> 2022-01-24  Richard Biener  <rguenther@suse.de>
>
> 	* fold-const.cc (multiple_of_p): Pass the correct type of
> 	the expression to the recursive invocation of multiple_of_p
> 	for conversions and use CASE_CONVERT.
OK by me.  Your call on gcc-12 vs gcc-13 timing.
jeff
  

Patch

diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index fd9c6352d4f..b155611578d 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -14149,14 +14149,14 @@  multiple_of_p (tree type, const_tree top, const_tree bottom)
 	}
       return 0;
 
-    case NOP_EXPR:
+    CASE_CONVERT:
       /* Can't handle conversions from non-integral or wider integral type.  */
       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
 	  || (TYPE_PRECISION (type)
 	      < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
 	return 0;
-
-      /* fall through */
+      return multiple_of_p (TREE_TYPE (TREE_OPERAND (top, 0)),
+			    TREE_OPERAND (top, 0), bottom);
 
     case SAVE_EXPR:
       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);