[cfe-commits] [patch] Add codegen for the __noop intrinsic

Nico Weber thakis at chromium.org
Wed Sep 26 00:29:21 PDT 2012


On Wed, Sep 26, 2012 at 4:24 PM, Eli Friedman <eli.friedman at gmail.com> wrote:
> On Tue, Sep 25, 2012 at 11:36 PM, Nico Weber <thakis at chromium.org> wrote:
>> On Wed, Sep 26, 2012 at 3:06 PM, Nico Weber <thakis at chromium.org> wrote:
>>> On Wed, Sep 26, 2012 at 2:49 PM, Eli Friedman <eli.friedman at gmail.com> wrote:
>>>> On Tue, Sep 25, 2012 at 10:05 PM, Nico Weber <thakis at chromium.org> wrote:
>>>>> Hi,
>>>>>
>>>>> similar to the __debugbreak patch, this adds codegen support for __noop.
>>>>
>>>> You don't actually have to call llvm.donothing... like the name says,
>>>> it doesn't do anything. :)  "return RValue::get(0);" should be
>>>> sufficient.
>>>
>>> My patch has nicer -S -emit-llvm output :-) But sure, I'll change it.
>>>
>>>>
>>>> Do we actually perform semantic analysis correctly for __noop?
>>>
>>> Not completely.
>>>
>>>> In MSVC, are the arguments unevaluated in the semantic analysis sense?
>>>
>>> cl seems to do sema for __noop, __noop(3 + someclassinstanc) results
>>> in a syntax error. So does wrapping a statement in __noop.
>
> How about something like the following?
>
> template<typename T> static void f() { T x = 10; }
> void g() { __noop(f<void>()); }
>
> (By "unevaluated', I mean in the same sense that the operand of sizeof
> is unevaluated.)

This compiles fine with cl but currently errors out with clang:

C:\src\chrome\src>type test.cc
template<typename T> static void f() { T x = 10; }
void g() { __noop(f<void>()); }

C:\src\chrome\src>cl /c test.cc
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cc

C:\src\chrome\src>..\..\llvm-ninja\bin\clang++.exe -c test.cc
test.cc:2:19: error: argument type 'void' is incomplete
void g() { __noop(f<void>()); }
                  ^~~~~~~~~
test.cc:1:42: error: variable has incomplete type 'void'
template<typename T> static void f() { T x = 10; }
                                         ^
test.cc:2:19: note: in instantiation of function template
specialization 'f<void>' requested here
void g() { __noop(f<void>()); }
                  ^
2 errors generated.

>
>>>> Do we do the right thing for expressions with non-POD type?
>>>> Expressions with cleanups?
>>>
>>> It looks like cl runs cleanups, __noop(MyClass()) runs destructors
>>> with cl (but not with clang). Do you want me to fix this before
>>> landing this patch?
>>
>> Err, this is actually not true.
>
> Okay.
>
> -Eli



More information about the cfe-commits mailing list