From 84355514f445ca2c7e3de1e05b8d2a2993f96cbc Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab@suse.de>
Date: Wed, 29 Mar 2017 14:18:07 +0000
Subject: [PATCH] re PR ada/80146 (ICE in copy_to_mode_reg, at explow.c:612)

	PR ada/80146
	* calls.c (prepare_call_address): Convert funexp to Pmode before
	copying to temp reg.

From-SVN: r246570
---
 gcc/ChangeLog | 6 ++++++
 gcc/calls.c   | 3 +++
 2 files changed, 9 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f41a1d5533d1..bbac099a2c8c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-03-29  Andreas Schwab  <schwab@suse.de>
+
+	PR ada/80146
+	* calls.c (prepare_call_address): Convert funexp to Pmode before
+	copying to temp reg.
+
 2017-03-29  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
 	PR tree-optimization/80158
diff --git a/gcc/calls.c b/gcc/calls.c
index 61caf4ca752c..c92e35ea5a8d 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -206,6 +206,9 @@ prepare_call_address (tree fndecl_or_type, rtx funexp, rtx static_chain_value,
 	  DECL_STATIC_CHAIN (fndecl_or_type) = 1;
 	  rtx chain = targetm.calls.static_chain (fndecl_or_type, false);
 
+	  if (GET_MODE (funexp) != Pmode)
+	    funexp = convert_memory_address (Pmode, funexp);
+
 	  /* Avoid long live ranges around function calls.  */
 	  funexp = copy_to_mode_reg (Pmode, funexp);
 
-- 
GitLab