[llvm-commits] [llvm] r75571 - in /llvm/trunk: lib/Transforms/Scalar/SimplifyCFGPass.cpp test/Transforms/SimplifyCFG/2009-07-13-no-delete-asm.ll
Dale Johannesen
dalej at apple.com
Tue Jul 14 10:09:14 PDT 2009
On Jul 13, 2009, at 9:03 PMPDT, Chris Lattner wrote:
>
> On Jul 13, 2009, at 5:53 PM, Eli Friedman wrote:
>
>> On Mon, Jul 13, 2009 at 5:45 PM, Dale Johannesen<dalej at apple.com>
>> wrote:
>>> --- llvm/trunk/test/Transforms/SimplifyCFG/2009-07-13-no-delete-
>>> asm.ll (added)
>>> +++ llvm/trunk/test/Transforms/SimplifyCFG/2009-07-13-no-delete-
>>> asm.ll Mon Jul 13 19:45:38 2009
>>> @@ -0,0 +1,11 @@
>>> +; RUN: llvm-as < %s | opt -simplifycfg | llvm-dis | grep xor
>>> +; ModuleID = '<stdin>'
>>> +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-
>>> i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-
>>> a0:0:64-f80:128:128"
>>> +target triple = "i386-apple-darwin9.6"
>>> +
>>> +define void @bar() nounwind {
>>> +entry:
>>> + store i16 undef, i16* null
>>> + %asmtmp = call i32 asm sideeffect "xor $0, $0",
>>> "=={bx},rm,~{dirflag},~{fpsr},~{flags},~{memory}"(i16 undef)
>>> nounwind ; <i32> [#uses=0]
>>> + ret void
>>> +}
>>
>> Umm, this testcase quite clearly has undefined behavior; what is this
>> patch trying to fix?
>
> Beyond that, what does the store have to do with the undef. The
> store being undefined means the asm is not reachable, so it should
> be deleted.
No, the gcc doc is (for once) quite clear that volatile asm's should
never be deleted. They aren't necessarily executable code, they might
change the section of assembly, or define a global data object, or
something like that. I could probably be persuaded to add a check for
volatile, but I don't think it's a good idea; the goal of asm handling
should be to imitate gcc as much as possible (that's the only
reasonable definition of how they should work, although it's probably
not fully implementable in llvm), and gcc doesn't eliminate this one.
The original testcase, which I perhaps should not have modified,
involves a load from undefined memory feeding into a volatile asm;
earlier optimizations removed the load in favor of the store above.
They probably shouldn't have done that, which is a later patch.
Asm's are outside standards, so standard concepts like "undefined
behavior" aren't very useful in dealing with them.
More information about the llvm-commits
mailing list