Running -early-cse on declare void @rn() readnone nounwind define void @f() { entry: call void @rn() ret void } removes the call to @rn(). But @rn() could have had an infinite loop in it in which case @f() went from being a non-terminating program to an terminating no-op. Is this intentional? The only way I can see this transform being legal is if infinite loops are declared to have undefined behavior, but I could not find anything in the LLVM specification that mentions this. -- Sanjoy
At least in C/C++ that's UB, yes. Some years ago there was a lot of discussion about this on the ML. Se Nick's patch, for example: http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20100705/103670.html The patch was eventually dropped, I don't recall why. I think it's fine to assume that readnone functions always terminate. It would probably fine for readonly functions as well. Nuno -----Original Message----- From: Sanjoy Das Sent: Saturday, June 27, 2015 9:29 PM Subject: [LLVMdev] readonly and infinite loops Running -early-cse on declare void @rn() readnone nounwind define void @f() { entry: call void @rn() ret void } removes the call to @rn(). But @rn() could have had an infinite loop in it in which case @f() went from being a non-terminating program to an terminating no-op. Is this intentional? The only way I can see this transform being legal is if infinite loops are declared to have undefined behavior, but I could not find anything in the LLVM specification that mentions this. -- Sanjoy
On Sat, Jun 27, 2015 at 2:16 PM, Nuno Lopes <nunoplopes at sapo.pt> wrote:> At least in C/C++ that's UB, yes.So you cannot map every turing machine to a valid C/C++ program then. :) Also, does this mean that "daemon" programs that run continuously till they're killed by the OS (using a mechanism that is not visible in C) are effectively undefined? -- Sanjoy> Some years ago there was a lot of discussion about this on the ML. Se > Nick's patch, for example: > http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20100705/103670.html > The patch was eventually dropped, I don't recall why. I think it's fine to > assume that readnone functions always terminate. It would probably fine for > readonly functions as well. > > Nuno > > > -----Original Message----- > From: Sanjoy Das > Sent: Saturday, June 27, 2015 9:29 PM > Subject: [LLVMdev] readonly and infinite loops > > Running -early-cse on > > declare void @rn() readnone nounwind > > define void @f() { > entry: > call void @rn() > ret void > } > > removes the call to @rn(). But @rn() could have had an infinite loop > in it in which case @f() went from being a non-terminating > program to an terminating no-op. Is this intentional? > > The only way I can see this transform being legal is if infinite loops > are declared to have undefined behavior, but I could not find anything > in the LLVM specification that mentions this. > > -- Sanjoy