問題タブ [gimple]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - GCC -O0 がビットごとの AND を変換し、乗算して分岐するのはなぜですか?
gcc が分岐と条件付き移動を使用する時期を調査していたところ、変数のビット 0 でビットごとの AND 演算を使用すると、奇妙な結果が見つかりました。具体的には、私が行う場合:
gcc at -O0 は最初に argc と 0x1 を計算し、次にその結果に基づいて別の基本ブロックに分岐します。算術演算から分岐への変換は、元のツリーを早期にダンプするように思われます。次のようになります。
そしてGIMPLEは
ビットごとの AND の両側を使用しない場合、これは発生しないようです。また、0x1 ではなく 0x2 と AND を使用しても発生しないようです。そのような場合、ジャンプのない純粋なデータ処理コードを取得します。もちろん、最適化レベルが 1 以上の場合、ジャンプのない最適化されたコードが得られますが、GCC が分岐に変換される理由/方法/場所にまだ興味があります。
Godbolt でテストすると、clang はこれをまったく行わないようで、GCC はバージョン 4.1.2 と 4.4.7 の間で分岐への変換を開始しました。