2017-05-16 3 views
1

[gccのフラグ:-O3 -funsigned-CHAR] [asm explorer]回転パラメータが符号なしのcharである場合、GCC 7.1は完全に回転を最適化しません。これは妥当ですか?

//partially optimized to: and, rol 
unsigned int rol(unsigned int x, unsigned char r) 
{ 
    r &= 31; return (x << r) | (x >> (32-r)); 
} 

//optimized to single: rol 
unsigned int rol(unsigned int x, unsigned int r) 
{ 
    r &= 31; return (x << r) | (x >> (32-r)); 
} 
+0

あなたのゴッドボルトのリンクが壊れています。 「それは妥当ですか」とはどういう意味ですか?生成されたasmとあなたがあなたの質問に期待するものを表示してください。 –

+0

'r == 0'のコードには未定義の動作があることに注意してください。 –

+0

c標準x >> 32によれば、gccは警告を出しますが、結果の式は "x | 0"、 "x | x"と評価され、両方が "x"に等しいので最終結果は明確に定義されている。 –

答えて

2

あなたは-daでコンパイルし、生成された*.combineダンプを見れば、あなたは第二の機能が正常に一致していることがわかります

(set (reg:SI 91) 
     (rotate:SI (reg/v:SI 89 [ x ]) 
      (subreg:QI (and:SI (reg/v:SI 90 [ r ]) 
        (const_int 31 [0x1f])) 0))) 

最初のものは

(set (reg:SI 93) 
     (rotate:SI (reg/v:SI 90 [ x ]) 
      (and:QI (subreg:QI (reg:SI 92 [ r ]) 0) 
       (const_int 31 [0x1f])))) 

charにint型から行くの順に失敗したとしながら、 andの実行は異なります。 GCCにはおそらく、一方を他方に、または最悪の場合にはもう一方のパターンを正規化する変換がありません。

既に報告されているレポートが見つからない場合はGCC's bugzillaに報告してください。

関連する問題