On 07/04/2013 02:43 AM, dw wrote: > I think I may have answered my own question. While talking about > clobbers, the docs say: > > "You may not write a clobber description in a way that overlaps with an > input or output operand." > "There is no way for you to specify that an input operand is modified > without also specifying it as an output operand." > > So (by implication) if you modify an input, you are expected to specify > that fact, and you can't do that with a clobber. So, reading between > the lines, the assumption here is that modifying input-only parameters > is bad. > > Which brings us to the next question: If input-only parameters are > assumed to be unchanged, why are some being re-loaded? These > unnecessary instructions affect both program size and execution performance. > > The code below shows 2 instances of unnecessary assembly code being > generated: > > 1) rdi being loaded (unnecessarily) at 407818. > 2) eax being zeroed twice. > > And I can provide code that shows more. > > I'm trying to decide how important this is. If this is only happening > because I'm using an asm block, that's one thing. While not good, I'm > not optimistic about what's going to happen if I open a bug that only > affects performance around inline asm. > > On the other hand, it seems possible that this is a more general problem > where the optimizer is simply missing a category of optimization > opportunities. Ok, not likely, but possible. > > To file or not to file. That is the question. > > If anyone has any thoughts or insight to share, I'd love to hear it. > > dw > > On 7/2/2013 6:41 PM, dw wrote: >> I'm trying to understand how input parameters are used by gcc's >> extended asm. Each time I think I've got a handle on it, it does >> something else unexpected. >> >> For example, this c++ code: >> >> inline void moo(unsigned char *Dest, unsigned char Data, int Count) { >> asm volatile ( >> "rep stosb" >> : /* no outputs */ >> : "D" (Dest), "a" (Data), "c" (Count) >> : "memory"); >> } >> >> int main() >> { >> unsigned char buff1[32]; >> >> moo(buff1, 0, sizeof(buff1)); >> moo(buff1, 0, sizeof(buff1)); >> >> return 0; >> } >> >> Compiling for 64bit on i386 using -Os, I get: I get: main: .LFB1: leaq -32(%rsp), %rdi movl $32, %ecx xorl %eax, %eax #APP # 2 "z.c" 1 rep stosb # 0 "" 2 # 2 "z.c" 1 rep stosb # 0 "" 2 #NO_APP xorl %eax, %eax ret By the way, your asm is wrong: stosb modifies its registers, and you must tell GCC that. Andrew.