The conversion of dbg.declare into dbg.values doesn't take into account
the DIExpression attached to the intrinsic. In particular, when
converting:
store %val, ptr %alloca dbg.declare(ptr %alloca, !SomeVar, !DIExpression())
Mem2Reg will try to figure out if %val has the size of !SomeVar. If
it does, then a non-undef dbg.value is inserted:
dbg.value(%val, !SomeVar, !DIExpression())
This makes sense: the alloca is _the_ address of the variable. So a
store to the alloca is a store to the variable. However, if the
expression in the original intrinsic is a DW_OP_deref, this logic is
not applicable:
store ptr %val, ptr %alloca dbg.declare(ptr %alloca, !SomeVar, !DIExpression(DW_OP_deref))
Here, the alloca is *not* the address of the variable. A store to the
alloca is *not* a store to the variable. As such, querying whether
%val has the same size as !SomeVar is meaningless.
This patch addresses the issue by:
- Allowing the conversion when the expression is _only_ a DW_OP_deref
without any other expressions (see code comment).
- Checking that the expression does not start with a DW_OP_deref
before applying the logic that checks whether the value being stored and
the variable have the same length.
nit: exactly one operator / expression operator / operation etc?