[LLVMdev] [cfe-dev] lifetime.start/end clarification
Hal Finkel
hfinkel at anl.gov
Tue Nov 4 08:02:26 PST 2014
Hi Renato,
Just so this conversation does not get too side-tracked, from what Arnaud told me at the developers' meeting, this general issue breaks self-hosting of Clang/LLVM if we enable lifetime intrinsics for smaller objects. So even if the specific example is not really a well-defined program, the general problem still needs to be resolved for well-defined programs.
-Hal
----- Original Message -----
> From: "Renato Golin" <renato.golin at linaro.org>
> To: "Arnaud A. de Grandmaison" <arnaud.degrandmaison at arm.com>
> Cc: "Clang Dev" <cfe-dev at cs.uiuc.edu>, "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu>
> Sent: Tuesday, November 4, 2014 7:19:03 AM
> Subject: Re: [cfe-dev] [LLVMdev] lifetime.start/end clarification
>
> Hi Arnaud.
>
> In that path, X x seems to be undefined, so the behaviour is anyone's
> guess. If I'm not mistaken, the standard says that kind of code is
> ill-formed (6.7-p3).
>
> Clang folks might know better.
>
> cheers,
> --renato
>
> On 4 November 2014 11:59, Arnaud A. de Grandmaison
> <arnaud.degrandmaison at arm.com> wrote:
> > The LRM
> > (http://llvm.org/docs/LangRef.html#llvm-lifetime-start-intrinsic)
> > essentially states that:
> >
> > - ptr is dead before a call to “lifetime.start size, ptr”
> >
> > - ptr is dead after a call to “lifetime.end size, ptr”
> >
> >
> >
> > This is all good and fine, and the expected use case is that all
> > “lifetime.end size, ptr” markers are matched with a preceding
> > “lifetime.start size, ptr” in the CFG.
> >
> >
> >
> > What is supposed to happen when a “lifetime.end size, ptr” is not
> > matched
> > with a “lifetime.start size, ptr” ? I think there are a few
> > possible
> > answers:
> >
> > - the memory area pointed to by ptr is assumed to be alive since
> > function
> > entry
> >
> > - the memory area pointed to by ptr is assumed to be dead since
> > function
> > entry, as it has not been marked alive
> >
> > - this is an unexpected situation
> >
> >
> >
> > I think this ambiguity should be cleared in the LRM, because
> > today’s
> > implicit assumption may be broken at any time.
> >
> >
> >
> > This is not a theoretical question: clang can generate such cases.
> > For
> > example, the following testcase:
> >
> > struct X {
> >
> > void doSomething();
> >
> > char b[33];
> >
> > };
> >
> >
> >
> > void bar(X &);
> >
> > void baz();
> >
> >
> >
> > void test(int i) {
> >
> > if (i==9) {
> >
> > X x;
> >
> > x.doSomething();
> >
> > label:
> >
> > bar(x);
> >
> > } else {
> >
> > baz();
> >
> > if (i==0)
> >
> > goto label;
> >
> > }
> >
> > }
> >
> >
> >
> > Produces:
> >
> >
> >
> > %struct.X = type { [33 x i8] }
> >
> >
> >
> > define void @_Z4testi(i32 %i) {
> >
> > entry:
> >
> > %x = alloca %struct.X, align 1
> >
> > %cmp = icmp eq i32 %i, 9
> >
> > br i1 %cmp, label %if.then, label %if.else
> >
> >
> >
> > if.then: ; preds = %entry
> >
> > %0 = getelementptr inbounds %struct.X* %x, i64 0, i32 0, i64 0
> >
> > call void @llvm.lifetime.start(i64 33, i8* %0)
> >
> > call void @_ZN1X11doSomethingEv(%struct.X* %x)
> >
> > br label %label
> >
> >
> >
> > label: ; preds =
> > %if.else.label_crit_edge, %if.then
> >
> > %.pre-phi = phi i8* [ %.pre, %if.else.label_crit_edge ], [ %0,
> > %if.then ]
> >
> > call void @_Z3barR1X(%struct.X* dereferenceable(33) %x)
> >
> > call void @llvm.lifetime.end(i64 33, i8* %.pre-phi)
> >
> > br label %if.end3
> >
> >
> >
> > if.else: ; preds = %entry
> >
> > tail call void @_Z3bazv()
> >
> > %cmp1 = icmp eq i32 %i, 0
> >
> > br i1 %cmp1, label %if.else.label_crit_edge, label %if.end3
> >
> >
> >
> > if.else.label_crit_edge: ; preds =
> > %if.else
> >
> > %.pre = getelementptr inbounds %struct.X* %x, i64 0, i32 0, i64 0
> >
> > br label %label
> >
> >
> >
> > if.end3: ; preds =
> > %if.else, %label
> >
> > ret void
> >
> > }
> >
> >
> >
> > Note that the path thru if.else.label_crit_edge has no lifetime
> > start.
> >
> >
> >
> > Cheers,
> >
> > --
> >
> > Arnaud
> >
> >
> >
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list