私が達成しようとしているのは、以下の100000000
定数などの一部の定数 (コード内のアドレスを表す) の定数の折りたたみを避けることです。これが必要なのは、後で JIT コンパイルされたコードにパッチが適用され、オブジェクトの再配置によって定数が変更される可能性があるためです。
以下のコードは、(何としてでも) 定数の折りたたみを回避するための最善の努力です。うまくいきません。100011111
命令ストリームで定数になってしまいます。
llc -O0 code.ll -print-after-all
Expand ISel Pseudo-instructions
折りたたみがパスで発生することを明らかにします。
; ModuleID = '0'
target triple = "x86_64-unknown-linux-gnu"
define i64 @"0"() {
BlockEntry0:
%cell = alloca i64, align 8
store volatile i64 0, i64* %cell, align 8
%volatile_zero3 = load volatile i64, i64* %cell, align 8
%base = add i64 %volatile_zero3, 100000000
%volatile_zero4 = load volatile i64, i64* %cell, align 8
%opaque_offset = add i64 %volatile_zero4, 11111
%casted_base = inttoptr i64 %base to i8*
%gep = getelementptr i8, i8* %casted_base, i64 %opaque_offset
%as_ptr = bitcast i8* %gep to i64*
%loaded = load i64, i64* %as_ptr, align 4
%as_function = inttoptr i64 %loaded to i64 (i64)*
%ret_val = tail call i64 %as_function(i64 0)
ret i64 %ret_val
}
attributes #0 = { nounwind }
私の問題は、codegen レベルで simple に展開される組み込み関数を追加することで解決できることを認識していますmovabs reg, imm64
。ですが、当面の間、一時的な解決策を講じたいと思います。
質問: llvm で定数が折り畳まれない不透明な定数を作成することは可能ですか?
私のllvmバージョンは3.7.0svnです。