Mercurial > hg > graal-compiler
changeset 21309:0217a8e00642
LIRKind#merge: be more precise about references.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Tue, 12 May 2015 09:29:48 +0200 |
parents | e15605ce5aba |
children | 3bc3865789b1 |
files | graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/LIRKind.java |
diffstat | 1 files changed, 35 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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; } /**