From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: ndesaulniers <ndesaulniers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
llvm <llvm@lists.linux.dev>, Bill Wendling <morbo@google.com>,
James Y Knight <jyknight@google.com>,
Eli Friedman <efriedma@quicinc.com>
Subject: Re: clang asm goto issue small reproducer
Date: Wed, 15 Dec 2021 19:29:44 -0500 (EST) [thread overview]
Message-ID: <1481671522.34267.1639614584440.JavaMail.zimbra@efficios.com> (raw)
In-Reply-To: <CAKwvOdndCue_E4eE1_bnGisrPnmUY7vRb_FP_TMs4bQRTOi8Rw@mail.gmail.com>
----- On Dec 15, 2021, at 7:25 PM, ndesaulniers ndesaulniers@google.com wrote:
> On Wed, Dec 15, 2021 at 4:18 PM Nick Desaulniers
> <ndesaulniers@google.com> wrote:
>>
>> On Wed, Dec 15, 2021 at 3:50 PM Nick Desaulniers
>> <ndesaulniers@google.com> wrote:
>> >
>> > On Wed, Dec 15, 2021 at 2:06 PM Mathieu Desnoyers
>> > <mathieu.desnoyers@efficios.com> wrote:
>> > >
>> > > Hi Nick,
>> > >
>> > > I have a small reproducer for the asm goto issue we discussed over irc. I have
>> > > axed away all code that is not the problematic function by hand. Hopefully this
>> > > won't change the overall optimization context too much.
>> >
>> > If I cut the compilation pipeline off at after "middle-end"
>> > optimizations, I can see that `this_cpu_list_pop` returns `NULL` for
>> > test.c while in test-asm.c, it's a phi node of either NULL or head
>> > (which looks correct; for the test-asm.c case).
>> >
>> > "GVNPass" seems to be converting
>> >
>> > return: ; preds =
>> > %cleanup.thread19, %cleanup.thread
>> > %retval.118 = phi %struct.percpu_list_node* [ %9, %cleanup.thread ],
>> > [ null, %cleanup.thread19 ]
>> > ret %struct.percpu_list_node* %retval.118
>> >
>> > into:
>> >
>> > return: ; preds =
>> > %cleanup.thread19, %cleanup.thread
>> > ret %struct.percpu_list_node* null
>> >
>> > Which drops the
>> > %9 = load %struct.percpu_list_node*, %struct.percpu_list_node**
>> > %head, align 8, !tbaa !9
>>
>> Ah, Eli pointed out that I'm chasing the wrong squirrel. From test.c we have:
>>
>> struct percpu_list_node *head;
>> load = (intptr_t *)&head;
>> ret = rseq_cmpnev_storeoffp_load(targetptr, expectnot,
>> offset, load, cpu);
>>
>> then in rseq_cmpnev_storeoffp_load():
>> __asm__ __volatile__ goto (
>> :
>> :
>> [load] "m" (*load));
>>
>> Did we ever initialize head? Isn't this equivalent to:
>>
>> int* foo (void) {
>> int *head;
>> int **load;
>> load = &head;
>> asm(""::"m"(*load):"memory");
>> return head;
>> }
>>
>> Isn't that equivalent to:
>>
>> int* foo (void) {
>> int *head;
>> asm(""::"m"(head):"memory");
>> return head;
>> }
>>
>> For which neither compiler warns for -Wuninitialized? They would if
>> head was an argument to a function call...
>
> What's going on here...
>
> $ cat y.c
> void x (void) {
> int y;
> asm(""::"r"(y));
> }
> void z (void) {
> int y;
> asm(""::"m"(y));
> }
> $ clang -Wuninitialized y.c -c
> y.c:3:15: warning: variable 'y' is uninitialized when used here
> [-Wuninitialized]
> asm(""::"r"(y));
> ^
> y.c:2:8: note: initialize the variable 'y' to silence this warning
> int y;
> ^
> = 0
> 1 warning generated.
> $ gcc -Wuninitialized y.c -c
> y.c: In function ‘x’:
> y.c:3:3: warning: ‘y’ is used uninitialized [-Wuninitialized]
> 3 | asm(""::"r"(y));
> | ^~~
>
> Only 1 warning each? I expected 2.
>
> Is there something special about "m" constraints and -Wuninitialized?
In my work-arounds for the lack of output operands with asm goto,
I've used either of those tricks across various architectures:
- "m" (y) input operand with "memory" clobber, or
- "r" (&y) input operand with "memory" clobber
to achieve writing to a memory area from assembler without having
output operands available.
It may be stretching the definitions, but those were my (perhaps
ill advised) expectations.
Thanks,
Mathieu
>
> --
> Thanks,
> ~Nick Desaulniers
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
next prev parent reply other threads:[~2021-12-16 0:29 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <157245708.33559.1639605989199.JavaMail.zimbra@efficios.com>
2021-12-15 23:50 ` clang asm goto issue small reproducer Nick Desaulniers
2021-12-16 0:18 ` Nick Desaulniers
2021-12-16 0:25 ` Nick Desaulniers
2021-12-16 0:29 ` Mathieu Desnoyers [this message]
2021-12-16 16:39 ` Mathieu Desnoyers
2021-12-16 0:26 ` Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1481671522.34267.1639614584440.JavaMail.zimbra@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=efriedma@quicinc.com \
--cc=jyknight@google.com \
--cc=llvm@lists.linux.dev \
--cc=morbo@google.com \
--cc=ndesaulniers@google.com \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.