javaTweet前回はマシンコードの生成処理を見ました。jyukutyo.hatenablog.comこの記事に沿ってGraalの理解を深めています。Java今回はグラフを最適化することでより効率的なコードを生成する、という部分です。正規化(Canonicalisation)ここでの正規化は、ノードを再配置することを意味しています。さまざまな目的のためのものですが、定数畳み込みとノードの簡素化に着目します。ノード自体に(子ノードを含む)自分自身を簡素化するメソッドがあります。各ノードはorg.graalvm.compiler.graph.spi.Canonicalizableを実装しています。tool);}ここで、-(-x)という式を考えます(xは数値)。これをノード上で見てみます。-はnegate、org.graalvm.compiler.nodes.calc.NegateNodeがあります。前述の式の変換と同様に、NegateNodeの子ノードがNegateNodeであれば、値をそのまま返すだけにして、簡素化します。forValue).getValue();で値だけ取り出しています。これでNegateNodeを取り除けたので、出力するマシンコードもより少ない命令にできます。実はfindSynonym(ValueNode)はcanonical()から呼び出されていません(引数の数が合わない)。findSynonym(ValueNode)はNegateNode#create()で呼び出されます。簡素化としては単純な処理なので、生成時にやっているのでしょう。AddNodeのcanonical()では、同じ値の加算と減算があるときにまとめたりしています。前回はグラフノードの生成を見ました。前回はGraalのグラフを見ました。関西Javaエンジニアの会の代表/発起人です。JVMやJavaについて書きます。(51)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。