[llvm-dev] Problem with the LLVM v8.0 IR 'select' instruction

Craig Topper via llvm-dev llvm-dev at lists.llvm.org
Sun Jul 7 20:53:40 PDT 2019


I believe your issue is that @Start has the readnone attribute. This is
telling the optimizers that @Start doesn't read or write any memory.

~Craig


On Sun, Jul 7, 2019 at 7:54 PM Mikael Egevig via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Hi again,
>
> It is probably me doing something wrong, but I have attached a trimmed
> down sample that shows the issue and the output that Clang 8.0.0 makes
> (using the binary release from llvm.org).
>
> I invoke clang as follows: clang -S -O3 -o Evergrowing.s -Wall
> Evergrowing.ll
>
> I tried using -O1, -O2, and -O3, but all where the same.  Please notice
> that I renamed 'main()' to 'mainfunc()' to be sure Clang isn't picking up
> 'main()' as a reserved, special function.
>
> This on a Windows 10 x64 PC, but I got exactly the same behavior on arm7hf
> and aarch64.
>
>
> Cheers,
> Mikael Egevig
>
>
> Den man. 8. jul. 2019 kl. 04.30 skrev Mehdi AMINI <joker.eph at gmail.com>:
>
>> Hi,
>>
>>
>>
>> On Sun, Jul 7, 2019 at 4:26 PM Mikael Egevig via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>>
>>> Hi guys,
>>>
>>> I am doing a hobby compiler using LLVM.  I have a rather peculiar
>>> problem with the 'select' instruction, as far as I can see.  Given this
>>> code:
>>>
>>> ************************************************
>>> ; Run-time Library Definitions
>>> %Exception = type { i8 }
>>>
>>> define private %Exception* @Start(i1* %$result) #0
>>> {
>>> prologue:
>>>     store i1 true, i1* %$result
>>>     br label %epilogue
>>> epilogue:
>>>     ret %Exception* null
>>> }
>>>
>>> ; Generated main() function.
>>> define i32 @main(i32 %argc, i8** %argv)
>>> {
>>> prologue:
>>>     %0 = alloca i1
>>>     %1 = call %Exception *@Start(i1* %0)
>>>     %2 = load i1, i1* %0
>>>     %3 = select i1 %2, i32 0, i32 1
>>>     ret i32 %3
>>> }
>>> ************************************************
>>>
>>> I'd expect the 'select' instruction in main() to yield zero, not one.
>>>
>>
>> Seems correct to me.
>>
>>
>>>   But when I compile the sample on x86_64, arm7, and aarch64, I always
>>> get code that yields one.
>>>
>>
>> Can you provide a reproducer?
>> As far as I can tell the optimizer folds the code you provided above to
>> yield 0: https://godbolt.org/z/T5wkSJ
>>
>> --
>> Mehdi
>>
>>
>>
>>>
>>> The idea is that if the program, @Start, returns false, one should be
>>> returned to the OS and vice versa.  I guess I could use 'not' instead of
>>> 'select', but I don't understand the behavior of 'select'.
>>>
>>> The above code is automatically generated, except I have removed all
>>> irrelevant code generated by the compiler.
>>>
>>> I'm not sure if LLVM gets confused by me returning the result in an
>>> alloca'ed area, but I use the return value, of all functions, for the
>>> exception pointer (null = no exception).
>>>
>>> Thanks in advance!
>>>
>>>
>>> Cheers,
>>> Mikael Egevig
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190707/7bb90af4/attachment-0001.html>


More information about the llvm-dev mailing list