Issue 136816
Summary why clang use Ltmp lable
Labels clang
Assignees
Reporter LukeSTM
    example:

```
#include <stdio.h>

typedef struct {
    volatile int counter;
} Counter;

void foo(Counter *v, int i) {
    int result, val, tmp;

    __asm__ __volatile__(
        ".arch_extension mp\n"                
 "9998:    " "pldw\t%a0" "\n"           
        "    .pushsection \".alt.smp.init\", \"a\"\n" 
        "  .long   9998b - .\n" 
        "  " "pld\t%a0" "\n"                   
 " .popsection\n"                       
        "1: ldrex   %0, [%4]\n"               
        "   add     %1, %0, %5\n" 
        "   strex   %2, %1, [%4]\n"             
        "   teq %2, #0\n"                  
        "   bne     1b" 
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Qo" (v->counter) 
        : "r" (&v->counter), "Ir" (i)         
        : "cc"                                
    );

    printf("Updated counter: %d\n", v->counter);
}

int main() {
    Counter c = {0};

 printf("Initial counter: %d\n", c.counter);
    foo(&c, 5);

 return 0;
}```

https://godbolt.org/z/Px35ejvbn

Clang will split the `foo` function in the example into two parts, using `Ltmp0` to represent the embedded assembly logic in the source code. Why is this done?

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to