[llvm-dev] [cfe-dev] [RFC] Introducing a byte type to LLVM

Harald van Dijk via llvm-dev llvm-dev at lists.llvm.org
Sun Jun 6 15:19:03 PDT 2021

On 06/06/2021 20:29, James Courtier-Dutton via llvm-dev wrote:
> See inline
> On Sun, 6 Jun 2021 at 20:15, Nuno Lopes via cfe-dev
> <cfe-dev at lists.llvm.org> wrote:
>> Now consider that p/q are pointers. In particular they are the following:
>> char a[n];
>> char q[n];
>> char *p = a + n;
>> inlining the definitions, originally we had:
>> if (a+n == q) {     <-  This is the problem. This being true or false is undefined. One compiler might make them equal, another will not.
>>    *(a+n-1) = 0;
>> }

That is not the problem. It is true that whether a+n and q compare equal 
is unspecified, but that is irrelevant. *If* they compare equal, then 
the if block must execute as written, else it must not. The only valid 
options are: either a[n-1] gets set to zero, or a[n-1] is left 
unmodified. Any transformation to undefined IR is invalid.

You can change the example to something that has fully defined 
behaviour, even, simply by:

   if (a+n == q) {
     *(a+n-1) = 0;
   } else {
     *(a+n-1) = 0;

If LLVM fails to notice that the two branches are equivalent (allowing 
the branch to be eliminated entirely), you still have the exact same 
problem with the first branch potentially getting mis-optimised.

Harald van Dijk

More information about the llvm-dev mailing list