On 05/04/2017 08:37 AM, Jeff Law wrote:

You understanding is slightly wrong however, The ASSERT_EXPRs and conditionals map 100% through propagation and into simplification. It's only during simplification that we lose the direct mapping as we change the conditional in order to remove the unnecessary type conversion. Threading runs after simplification.

Another approach here would be to simplify the ASSERT_EXPR in the same manner that we simplify the conditional. That may even be better for various reasons in the short term. Let me poke at that.
Now I remember why I didn't do that (simplify the ASSERT_EXPR).  It
doesn't work :-)

So given an ASSERT_EXPR like:

  v1_378 = ASSERT_EXPR <v1_179, v1_179 <= 0>;

Let's assume for the sake of argument v1_179 was set by a type cast from xx_1. We can simplify that ASSERT_EXPR into

  v1_378 = ASSERT_EXPR <v1_179, xx_1 <= 0>;

But note we can not change operand 0 of the ASSERT_EXPR. That would change the *type* of the ASSERT_EXPR and blows up all kinds of things later. So the ASSERT_EXPR at best can morph into this form:

  v1_378 = ASSERT_EXPR <v1_179, xx_1 <= 0>;

When the threader wants to look for an ASSERT_EXPR that creates a range for an object, it does lookups based on a match of operand 0 without digging into the expression in operand 1.

That's something we may want to change in the future (it plays into issues that arise in patch #3) but in the immediate term it's still best to defer that one special case of tweaking a GIMPLE_COND.

Jeff

Reply via email to