# HG changeset patch # User Josef Eisl # Date 1431415788 -7200 # Node ID 0217a8e006420b61523819c22809db204492e7e6 # Parent e15605ce5abab7b4de4b205e7532b9bcc887c177 LIRKind#merge: be more precise about references. diff -r e15605ce5aba -r 0217a8e00642 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/LIRKind.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/LIRKind.java Mon May 11 13:47:16 2015 +0200 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/LIRKind.java Tue May 12 09:29:48 2015 +0200 @@ -133,15 +133,49 @@ */ public static LIRKind merge(Value... inputs) { assert inputs.length > 0; + LIRKind mergeKind = null; + for (Value input : inputs) { LIRKind kind = input.getLIRKind(); + + assert mergeKind == null || verifyMoveKinds(mergeKind, kind) : String.format("Input kinds do not match %s vs. %s", mergeKind, kind); + if (kind.isDerivedReference()) { + /** + * Kind is a derived reference therefore the result can only be also a derived + * reference. + */ return kind; } + if (mergeKind == null) { + mergeKind = kind; + continue; + } + + if (kind.isValue()) { + /* Kind is a value. */ + if (mergeKind.referenceMask != 0) { + /* + * Inputs consists of values and references. Make the result a derived + * reference. + */ + return mergeKind.makeDerivedReference(); + } + /* Check that other inputs are also values. */ + } else { + /* Kind is a reference. */ + if (mergeKind.referenceMask != kind.referenceMask) { + /* + * Reference maps do not match so the result can only be a derived reference. + */ + return mergeKind.makeDerivedReference(); + } + } + } // all inputs are values or references, just return one of them - return inputs[0].getLIRKind(); + return mergeKind; } /**