On 6/27/19 9:00 AM, Jeff Law wrote:
> On 6/26/19 8:40 PM, Martin Sebor wrote:
>> On 6/26/19 4:31 PM, Jeff Law wrote:
>>> On 6/25/19 5:03 PM, Martin Sebor wrote:
>>>
>>>>
>>>> The caller ensures that handle_char_store is only called for stores
>>>> to arrays (MEM_REF) or single elements as wide as char.
>>> Where?  I don't see it, even after fixing the formatting in
>>> strlen_check_and_optimize_stmt :-)
>>>
>>>>    gimple *stmt = gsi_stmt (*gsi);
>>>>
>>>>    if (is_gimple_call (stmt))
>>>
>>> I think we can agree that we don't have a call, so this is false.
>>>
>>>>   else if (is_gimple_assign (stmt) && !gimple_clobber_p (stmt))
>>>>      {
>>>>        tree lhs = gimple_assign_lhs (stmt);
>>> This should be true IIUC, so we'll go into its THEN block.
>>>
>>>
>>>>        if (TREE_CODE (lhs) == SSA_NAME && POINTER_TYPE_P (TREE_TYPE
>>>> (lhs)))
>>> Should be false.
>>>
>>>>        else if (TREE_CODE (lhs) == SSA_NAME && INTEGRAL_TYPE_P
>>>> (TREE_TYPE (lhs)))
>>>
>>> Should also be false.
>>>
>>>>        else if (TREE_CODE (lhs) != SSA_NAME && !TREE_SIDE_EFFECTS (lhs))
>>> Should be true since LHS is a MEM_REF.
>>>
>>>
>>>>         {
>>>>            tree type = TREE_TYPE (lhs);
>>>>            if (TREE_CODE (type) == ARRAY_TYPE)
>>>>              type = TREE_TYPE (type);
>>>>            if (TREE_CODE (type) == INTEGER_TYPE
>>>>                && TYPE_MODE (type) == TYPE_MODE (char_type_node)
>>>>                && TYPE_PRECISION (type) == TYPE_PRECISION
>>>> (char_type_node))
>>>>              {
>>>>                if (! handle_char_store (gsi))
>>>>                  return false;
>>>>              }
>>>>          }
>>> If TREE_TYPE (type) is an ARRAY_TYPE, we strip the ARRAY_TYPE.  We then
>>> verify that TYPE is a single character type.  _But_ we stripped away the
>>> ARRAY_TYPE.  So ISTM that we allow either an array of chars or a single
>>> char on the LHS.
>>>
>>> So how does this avoid multiple character stores?!?  We could have had
>>> an ARRAY_REF on the LHS and we never check the number of elements in the
>>> array.  There's no check on the RHS either.  SO I don't see how we
>>> guarantee that we're dealing with a single character store.
>>>
>>> What am I missing here?
>>
>> Can you show me a test case where it breaks?  If not, I don't know
>> what you want me to do.  I'll just move on to something else.
> THe thing to do is research what gimple accepts and what other passes
> may do.  Given this is a code generation bug, "just moving on" isn't
> really a good option unless we're going to rip out that little bit of code.
> 
> As I was thinking about this last night, the pass we'd want to look at
> would be store merging.  Let's do that on the call today.
Actually it was trivial to create with store merging.

char x[20];
foo()
{
  x[0] = 0x41;
  x[1] = 0x42;
}

  MEM <unsigned short> [(char *)&x] = 16961;

So clearly we can get this in gimple.  So we need a check of some kind,
either on the LHS or the RHS to ensure that we actually have a single
character store as opposed to something like the above.

jeff

Reply via email to