clang (LLVM) inline assembly - multiple constraints with useless spills / reloads

后端 未结 1 1022
后悔当初
后悔当初 2020-12-07 01:05

clang / gcc : Some inline assembly operands can be satisfied with multiple constraints, e.g., \"rm\", when an operand can be satisfied with a r

相关标签:
1条回答
  • 2020-12-07 01:18

    I had a response on the cfe-dev (clang front end developers' list) from one of the developers:

    LLVM currently always spills "rm" constraints in order to simplify the handling of inline asm in the backend (you can ask on llvmdev if you want details). I don't know of any plans to fix this in the near future.

    So it's clearly a 'known' issue. One of the goals of clang is to correctly handle gcc's inline assembly syntax, amongst other extensions, which it does in this case - just not very efficiently. In short, this isn't a bug, per se.


    Since this isn't a bug, I'm going to continue with the "r,m" constraint syntax. I figure that this is the best compromise for now. gcc will choose the best - presumably a register where possible - and clang will force the use of a register by ignoring further options after the comma. If nothing else, it still preserves the semantic intent of the assembly statement, i.e., describing possible constraints, even if they are ignored.


    A final note (20130715) : This particular example will not compile using the "r,m" constraint in a single position - we would have to supply an alternative constraint match for each, e.g.,

    : "=a,a" (rl), "=d,d" (rh) : "%0,0" (x), "r,m" (y)
    

    This is required for multiple alternative constraints with GCC. But we're getting into territory where GCC has been known to exhibit bugs in the past - whether or not this is true as of 4.8.1, I don't know. Clang works without the alternatives in the other constraints, which is incompatible with GCC syntax, and must therefore be considered a bug.

    If performance is critical, use "r", otherwise, stick with "rm" and maybe clang will address this in the future, even as it benefits GCC.

    0 讨论(0)
提交回复
热议问题