はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Rider】Rider2026.1よりILではなくアセンブリまで調べられる新機能が登場

はじめに

Rider2025.3の新機能として、Unityにより生成されたILを表示できるようになりました。

www.hanachiru-blog.com

ILに加えて、Rider 2026.1よりstandard JITReadyToRun (crossgen2)NativeAOT (ilc)によってコンパイルされたネイティブアセンブリまで見れるようになる新機能が登場しました。

blog.jetbrains.com

概要やインストール方法、実際に実験してみた結果まで書き残しておきたいと思います。

概要

ILではメソッド呼び出しとして残っていてもアセンブリではインライン化されていたり、SIMDの適応だったりと、ILを見るだけでは分からないような最適化がなされていることがあります。

それを調べるためにはIL Viewerだけでは実現することはできません。今回紹介するASM Viewerを用いることで、Rider上で調べることが可能になります。

インストール方法

デフォルトでは入っていないので、dotnet-disassembler-pluginというプラグインを導入する必要があります。

github.com

設定 -> プラグイン -> Marketplaceにて.NET Disassemblerをインストールして再起動すればOKです。

.NET Disassemblerというプラグインをインストール

使い方

調べ方

メニューバーの表示 -> ツールウィンドウ -> ASMで調べられます。またエディタ右側にASMのアイコンをタップしても開きました。

表示 -> ツールウィンドウ -> ASM
ASM Viewer

コンパイラの切り替え

ASM Viewerの歯車アイコンを選択し、Code Generatorから以下のどれかを選択することができます。

  • clrjit.dll
  • crossgen2.dll (R2R)
  • ilc (NativeAOT)
Code Generatorの変更

スナップショット

カメラアイコンを選択するとスナップショットをとることができ、差分の表示ができます。

スナップショット

実験

SIMDが適応されているか確認してみます。

C#
using System.Runtime.Intrinsics;

public class Program
{
    public static void Main(string[] args)
    {
        var v1 = Vector128.Create(1.0f, 2.0f, 3.0f, 4.0f);
        var v2 = Vector128.Create(5.0f, 6.0f, 7.0f, 8.0f);
        _ = AddVectors(v1, v2);
    }
    
    public static Vector128<float> AddVectors(Vector128<float> left, Vector128<float> right)
    {
        return Vector128.Add(left, right);
    }
}
ASM Viewer
G_M000_IG01:
            stp     fp, lr, [sp, #-0x10]!
            mov     fp, sp
 
G_M000_IG02:
            fadd    v0.4s, v0.4s, v1.4s
 
G_M000_IG03:
            ldp     fp, lr, [sp], #0x10
            ret     lr

よく見ると.4sがついていることが分かります。これは128ビットのレジスタを「32ビットの単精度浮動小数点(float)4つ分」として扱うことを表しているので、SIMDが利用されていることが伺えます。

fadd    v0.4s, v0.4s, v1.4s