Request for reviews (M): 6964479: widen normalization of small int and long values should be symmetric
vladimir.kozlov at oracle.com
Sat Jun 26 01:53:51 PDT 2010
Thank you, John
You are right, I miscalculated. It seems, I got failures with it because I did not set correctly widen value for dual. I
updated webrev with normalizations for TypeInt::INT (and LONG).
On 6/26/10 12:02 AM, John Rose wrote:
> Reviewed. It is an improvement; thanks.
> But... The removal of the WidenMax case puzzles me. I don't see how it interacts with SYMINT, since SYMINT.hi - SYMINT.lo == juint_max-1. The intention there IIRC was simply to avoid narrow versions of TypeInt::INT (and LONG).
> -- John
> On Jun 25, 2010, at 5:03 PM, Vladimir Kozlov wrote:
>> Fixed 6964479: widen normalization of small int and long values should be symmetric
>> This issue was found during work on signflip problem.
>> PhaseCCP::saturate(), used by PhiNode::Value(), calls
>> TypeInt::widen() which may call TypeInt::make() which
>> normalizes small ints. On other hand TypeInt::xmeet() does not
>> call TypeInt::make() and does not normalizes small ints.
>> It may trigger next assert during CCP:
>> Current function is ccp_type_widens
>> 1314 assert(t->meet(t0) == t, "Not monotonic");
>> Call TypeInt::make() from TypeInt::xmeet() and normalize small
>> ints in TypeInt::xdual() so the type meet will be symmetric.
>> Remove normalization of big value since it was in conflict
>> with SYMINT type. The same was done for long type.
>> Passed CTW, JPRT, passed original test with signflip changes.
More information about the hotspot-compiler-dev