diff mbox

Wider modes for partial int modes

Message ID 503934AB-216F-411F-A1E0-50AC200DD075@comcast.net
State New
Headers show

Commit Message

Mike Stump June 8, 2012, 11:58 p.m. UTC
On Jun 8, 2012, at 4:11 PM, Mike Stump wrote:
> On Apr 17, 2012, at 2:08 PM, Bernd Schmidt wrote:
>> This patch enables GET_MODE_WIDER_MODE for MODE_PARTIAL_INT (by setting
>> the wider mode to the one the partial mode is based on), which is useful
>> for the port I'm working on: I can avoid defining operations on the
>> partial modes.
> 
> I think this breaks my port, in emit-rtl.c:
> 
> B       for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
>             mode != VOIDmode;
>             mode = GET_MODE_WIDER_MODE (mode))
>  =>      const_tiny_rtx[i][(int) mode] = GEN_INT (i);
> 
> Doesn't work, as that does expects to step through all partial int modes.  The problem is, we went from P1QI -> P1SI, and now we go from P1QI to QI.  The problem is this, we never initialize P1SI anymore, and later, when initializing vector constants, things like V2P1SI dies, as P1SI was never built:
> 
>    /* We need to call this function after we set the scalar const_tiny_rtx                               
>       entries.  */
>    gcc_assert (const_tiny_rtx[constant][(int) inner]);
> 
> So, maybe we want to go through all modes, and just ask, are you a MODE_PARTIAL_INT, and initialize them that way?  Thoughts?

The below patch allows my port to at least initialize once more...  Thoughts?  Ok?

Comments

Bernd Schmidt June 11, 2012, 10:12 a.m. UTC | #1
On 06/09/2012 01:58 AM, Mike Stump wrote:
> On Jun 8, 2012, at 4:11 PM, Mike Stump wrote:
>> On Apr 17, 2012, at 2:08 PM, Bernd Schmidt wrote:
>>> This patch enables GET_MODE_WIDER_MODE for MODE_PARTIAL_INT (by setting
>>> the wider mode to the one the partial mode is based on), which is useful
>>> for the port I'm working on: I can avoid defining operations on the
>>> partial modes.
>>
>> I think this breaks my port, in emit-rtl.c:
>>
>> B       for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
>>              mode != VOIDmode;
>>              mode = GET_MODE_WIDER_MODE (mode))
>>   =>       const_tiny_rtx[i][(int) mode] = GEN_INT (i);
>>
>> Doesn't work, as that does expects to step through all partial int modes.  The problem is, we went from P1QI ->  P1SI, and now we go from P1QI to QI.  The problem is this, we never initialize P1SI anymore, and later, when initializing vector constants, things like V2P1SI dies, as P1SI was never built:

>> So, maybe we want to go through all modes, and just ask, are you a MODE_PARTIAL_INT, and initialize them that way?  Thoughts?
>
> The below patch allows my port to at least initialize once more...  Thoughts?  Ok?

Looks good to me.


Bernd
diff mbox

Patch

diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index af804df..8ff74c8 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -5704,9 +5704,9 @@  init_emit_once (void)
 	   mode = GET_MODE_WIDER_MODE (mode))
 	const_tiny_rtx[i][(int) mode] = GEN_INT (i);
 
-      for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
-	   mode != VOIDmode;
-	   mode = GET_MODE_WIDER_MODE (mode))
+      for (mode = MIN_MODE_PARTIAL_INT;
+	   mode <= MAX_MODE_PARTIAL_INT;
+	   mode = (enum machine_mode)((int)(mode) + 1))
 	const_tiny_rtx[i][(int) mode] = GEN_INT (i);
     }
 
@@ -5717,9 +5717,9 @@  init_emit_once (void)
        mode = GET_MODE_WIDER_MODE (mode))
     const_tiny_rtx[3][(int) mode] = constm1_rtx;
 
-  for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
-       mode != VOIDmode;
-       mode = GET_MODE_WIDER_MODE (mode))
+  for (mode = MIN_MODE_PARTIAL_INT;
+       mode <= MAX_MODE_PARTIAL_INT;
+       mode = (enum machine_mode)((int)(mode) + 1))
     const_tiny_rtx[3][(int) mode] = constm1_rtx;
       
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_COMPLEX_INT);