[PATCH] D22900: Revert r244207 - Mark calls in thunk functions as tail-call optimization
Gerolf Hoflehner via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 1 17:45:42 PDT 2016
This is the IR I see in today’s trunk:
*** IR Dump Before Module Verifier ***
; Function Attrs: noinline optsize ssp
define i32 @_ZThn4_N1C4SeekE6_LARGE(%class.C* %this, %union._LARGE* byval align 4) unnamed_addr #2 align 2 {
entry:
%L = alloca %union._LARGE, align 8
%this.addr = alloca %class.C*, align 4
%1 = bitcast %union._LARGE* %L to i8*
%2 = bitcast %union._LARGE* %0 to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %2, i32 8, i32 4, i1 false)
store %class.C* %this, %class.C** %this.addr, align 4, !tbaa !2
%this1 = load %class.C*, %class.C** %this.addr, align 4
%3 = bitcast %class.C* %this1 to i8*
%4 = getelementptr inbounds i8, i8* %3, i32 -4
%5 = bitcast i8* %4 to %class.C*
%call = tail call i32 @_ZN1C4SeekE6_LARGE(%class.C* %5, %union._LARGE* byval align 4 %L) #6
ret i32 %call
}
> On Aug 1, 2016, at 12:55 PM, Reid Kleckner <rnk at google.com> wrote:
>
> rnk added a comment.
>
> So, if clang were to use a temporary alloca for the byval parameter, then yes, I agree marking it as a tail call would be incorrect. However, clang doesn't use an alloca, it forwards the byval pointer parameter directly to the callee:
That would be cleaner code, which I had in mind as follow up optimization. I think it would also require that clang verifies => where tail and byval there cannot be an alloca.
>
> define i32 @_ZThn4_N1C4SeekE6_LARGE(%class.C* nocapture readnone %this, %union._LARGE* byval nocapture readonly align 4 %L) unnamed_addr #0 align 2 {
> entry:
> %call = tail call i32 @_ZN1C4SeekE6_LARGE(%class.C* undef, %union._LARGE* byval nonnull align 4 %L)
> ret i32 %call
> }
>
> Maybe the test case is over-reduced, or the problematic IR was produced by an older version of clang?
You can always double check the larger test case in the PR.
>
>
> https://reviews.llvm.org/D22900
>
>
>
More information about the cfe-commits
mailing list