Terry Guo via llvm-dev
2020-Jul-23 16:15 UTC
[llvm-dev] How to optimize out the duplicated memory load instructions?
Hi Johannes,
Silly as me. I just figured out how to correctly use 'alias' metadata. I
should define them in IR like below:
!3 = !{!3}
!4 = !{!4}
!5 = !{!5, !3}
!6 = !{!6, !4}
And then use !5 and !6. The below usage is wrong:
!3 = !{!3}
!4 = !{!4}
Then use !3 and !4 in IR.
BR,
Terry
On Fri, Jul 24, 2020 at 12:12 AM Johannes Doerfert <
johannesdoerfert at gmail.com> wrote:
> `noalias` metadata is more complex than this:
>
> https://llvm.org/docs/LangRef.html#noalias-and-alias-scope-metadata
>
> I doubt the below was accepted by the AliasAnalysis as valid annotations
> and consequently ignored.
>
>
> On 7/23/20 10:48 AM, Terry Guo wrote:
> > Hi Johannes,
> >
> > Thanks for your help. I tried with something like below and nothing
> > changes. Maybe I am doing something wrong?
> >
> > 246001 check_exce_succ59: ; preds >
> %check_exce_succ40
> > **246002 %mem_base60 = load i8*, i8** %mem_base_addr_ptr, align 8,
> > !alias.scope !3
> > 246003 %offset161 = add i32 %call56, 4
> > 246004 %12 = sext i32 %offset161 to i64
> > 246005 %maddr62 = getelementptr inbounds i8, i8* %mem_base60, i64
%12
> > 246006 %data_ptr63 = bitcast i8* %maddr62 to i64*
> > **246007 store i64 0, i64* %data_ptr63, align 1, !noalias !3
> > **246008 %mem_base66 = load i8*, i8** %mem_base_addr_ptr, align 8,
> > !alias.scope !3
> > 246009 %offset167 = add i32 %call56, 12
> > 246010 %13 = sext i32 %offset167 to i64
> > ....
> > 382681 !3 = !{!3}
> > 382682 !4 = !{!4}
> >
> > BR,
> > Terry
> >
> > On Thu, Jul 23, 2020 at 11:43 PM Johannes Doerfert <
> > johannesdoerfert at gmail.com> wrote:
> >
> >> Hi Terry,
> >>
> >>
> >> various LLVM passes that run with O3 would do this for you,
assuming
> >> they could prove correctness.
> >>
> >> FWIW, the address is the same, so it is (most likely) an aliasing
> >> problem. I assume
> >>
> >> store i64 0, i64* %data_ptr63, align 8
> >>
> >> might clobber the loaded location so we do not reuse the first
load. You
> >> use alias metadata in IR or
> >>
> >> `noalias` (in IR) [= `restrict` (in C/C++)] attributes for
arguments to
> >> help the alias analysis.
> >>
> >>
> >> Is this what you were looking for?
> >>
> >>
> >> ~ Johannes
> >>
> >>
> >> On 7/23/20 10:25 AM, Terry Guo via llvm-dev wrote:
> >>> Hi there,
> >>>
> >>> The raw input IR is composed by my tool and the below one is
produced
> by
> >>> llvm opt tool with O3 optimization level. I am pretty sure
that the two
> >>> load instructions( %mem_base60 and %mem_base66) are
referring to the
> >> same
> >>> memory location. How can I instruct llvm optimization pass to
optimize
> >> out
> >>> the %mem_base66 and make the subsequent code reuse the
%mem_base60? I
> >>> tried with metadata 'alias.scope' and
'noalias' and it doesn't help.
> >> Thanks
> >>> for any advice.
> >>>
> >>> 392542 check_exce_succ59: ;
preds > >>> %check_exce_succ40
> >>> **392543 %mem_base60 = load i8*, i8** %mem_base_addr_ptr,
align 8
> >>> 392544 %offset161 = add i32 %call56, 4
> >>> 392545 %11 = sext i32 %offset161 to i64
> >>> 392546 %maddr62 = getelementptr inbounds i8, i8*
%mem_base60, i64 %11
> >>> 392547 %data_ptr63 = bitcast i8* %maddr62 to i64*
> >>> 392548 store i64 0, i64* %data_ptr63, align 8
> >>> **392549 %mem_base66 = load i8*, i8** %mem_base_addr_ptr,
align 8
> >>> 392550 %offset167 = add i32 %call56, 12
> >>> 392551 %12 = sext i32 %offset167 to i64
> >>> 392552 %maddr68 = getelementptr inbounds i8, i8*
%mem_base66, i64 %12
> >>> 392553 %data_ptr69 = bitcast i8* %maddr68 to i32*
> >>> 392554 store i32 %call, i32* %data_ptr69, align 8
> >>>
> >>> BR,
> >>> Terry
> >>>
> >>>
> >>> _______________________________________________
> >>> LLVM Developers mailing list
> >>> llvm-dev at lists.llvm.org
> >>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20200724/c15961e3/attachment-0001.html>
Terry Guo via llvm-dev
2020-Jul-23 16:20 UTC
[llvm-dev] How to optimize out the duplicated memory load instructions?
Hi Johannes, Sorry for the typo. I meant 'Silly me'. BR, Terry On Fri, Jul 24, 2020 at 12:15 AM Terry Guo <flameroc at gmail.com> wrote:> Hi Johannes, > > Silly as me. I just figured out how to correctly use 'alias' metadata. I > should define them in IR like below: > > !3 = !{!3} > !4 = !{!4} > > !5 = !{!5, !3} > !6 = !{!6, !4} > > And then use !5 and !6. The below usage is wrong: > > !3 = !{!3} > !4 = !{!4} > Then use !3 and !4 in IR. > > BR, > Terry > > On Fri, Jul 24, 2020 at 12:12 AM Johannes Doerfert < > johannesdoerfert at gmail.com> wrote: > >> `noalias` metadata is more complex than this: >> >> https://llvm.org/docs/LangRef.html#noalias-and-alias-scope-metadata >> >> I doubt the below was accepted by the AliasAnalysis as valid annotations >> and consequently ignored. >> >> >> On 7/23/20 10:48 AM, Terry Guo wrote: >> > Hi Johannes, >> > >> > Thanks for your help. I tried with something like below and nothing >> > changes. Maybe I am doing something wrong? >> > >> > 246001 check_exce_succ59: ; preds >> > %check_exce_succ40 >> > **246002 %mem_base60 = load i8*, i8** %mem_base_addr_ptr, align 8, >> > !alias.scope !3 >> > 246003 %offset161 = add i32 %call56, 4 >> > 246004 %12 = sext i32 %offset161 to i64 >> > 246005 %maddr62 = getelementptr inbounds i8, i8* %mem_base60, i64 %12 >> > 246006 %data_ptr63 = bitcast i8* %maddr62 to i64* >> > **246007 store i64 0, i64* %data_ptr63, align 1, !noalias !3 >> > **246008 %mem_base66 = load i8*, i8** %mem_base_addr_ptr, align 8, >> > !alias.scope !3 >> > 246009 %offset167 = add i32 %call56, 12 >> > 246010 %13 = sext i32 %offset167 to i64 >> > .... >> > 382681 !3 = !{!3} >> > 382682 !4 = !{!4} >> > >> > BR, >> > Terry >> > >> > On Thu, Jul 23, 2020 at 11:43 PM Johannes Doerfert < >> > johannesdoerfert at gmail.com> wrote: >> > >> >> Hi Terry, >> >> >> >> >> >> various LLVM passes that run with O3 would do this for you, assuming >> >> they could prove correctness. >> >> >> >> FWIW, the address is the same, so it is (most likely) an aliasing >> >> problem. I assume >> >> >> >> store i64 0, i64* %data_ptr63, align 8 >> >> >> >> might clobber the loaded location so we do not reuse the first load. >> You >> >> use alias metadata in IR or >> >> >> >> `noalias` (in IR) [= `restrict` (in C/C++)] attributes for arguments to >> >> help the alias analysis. >> >> >> >> >> >> Is this what you were looking for? >> >> >> >> >> >> ~ Johannes >> >> >> >> >> >> On 7/23/20 10:25 AM, Terry Guo via llvm-dev wrote: >> >>> Hi there, >> >>> >> >>> The raw input IR is composed by my tool and the below one is produced >> by >> >>> llvm opt tool with O3 optimization level. I am pretty sure that the >> two >> >>> load instructions( %mem_base60 and %mem_base66) are referring to the >> >> same >> >>> memory location. How can I instruct llvm optimization pass to optimize >> >> out >> >>> the %mem_base66 and make the subsequent code reuse the %mem_base60? >> I >> >>> tried with metadata 'alias.scope' and 'noalias' and it doesn't help. >> >> Thanks >> >>> for any advice. >> >>> >> >>> 392542 check_exce_succ59: ; preds >> >>> %check_exce_succ40 >> >>> **392543 %mem_base60 = load i8*, i8** %mem_base_addr_ptr, align 8 >> >>> 392544 %offset161 = add i32 %call56, 4 >> >>> 392545 %11 = sext i32 %offset161 to i64 >> >>> 392546 %maddr62 = getelementptr inbounds i8, i8* %mem_base60, i64 >> %11 >> >>> 392547 %data_ptr63 = bitcast i8* %maddr62 to i64* >> >>> 392548 store i64 0, i64* %data_ptr63, align 8 >> >>> **392549 %mem_base66 = load i8*, i8** %mem_base_addr_ptr, align 8 >> >>> 392550 %offset167 = add i32 %call56, 12 >> >>> 392551 %12 = sext i32 %offset167 to i64 >> >>> 392552 %maddr68 = getelementptr inbounds i8, i8* %mem_base66, i64 >> %12 >> >>> 392553 %data_ptr69 = bitcast i8* %maddr68 to i32* >> >>> 392554 store i32 %call, i32* %data_ptr69, align 8 >> >>> >> >>> BR, >> >>> Terry >> >>> >> >>> >> >>> _______________________________________________ >> >>> LLVM Developers mailing list >> >>> llvm-dev at lists.llvm.org >> >>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200724/ed316799/attachment.html>
Johannes Doerfert via llvm-dev
2020-Jul-23 16:34 UTC
[llvm-dev] How to optimize out the duplicated memory load instructions?
I'm not sure if the proper use of the metadata yielded the expected result or not. On 7/23/20 11:20 AM, Terry Guo wrote:> Hi Johannes, > > Sorry for the typo. I meant 'Silly me'. > > BR, > Terry > > On Fri, Jul 24, 2020 at 12:15 AM Terry Guo <flameroc at gmail.com> wrote: > >> Hi Johannes, >> >> Silly as me. I just figured out how to correctly use 'alias' metadata. I >> should define them in IR like below: >> >> !3 = !{!3} >> !4 = !{!4} >> >> !5 = !{!5, !3} >> !6 = !{!6, !4} >> >> And then use !5 and !6. The below usage is wrong: >> >> !3 = !{!3} >> !4 = !{!4} >> Then use !3 and !4 in IR. >> >> BR, >> Terry >> >> On Fri, Jul 24, 2020 at 12:12 AM Johannes Doerfert < >> johannesdoerfert at gmail.com> wrote: >> >>> `noalias` metadata is more complex than this: >>> >>> https://llvm.org/docs/LangRef.html#noalias-and-alias-scope-metadata >>> >>> I doubt the below was accepted by the AliasAnalysis as valid annotations >>> and consequently ignored. >>> >>> >>> On 7/23/20 10:48 AM, Terry Guo wrote: >>>> Hi Johannes, >>>> >>>> Thanks for your help. I tried with something like below and nothing >>>> changes. Maybe I am doing something wrong? >>>> >>>> 246001 check_exce_succ59: ; preds >>>> %check_exce_succ40 >>>> **246002 %mem_base60 = load i8*, i8** %mem_base_addr_ptr, align 8, >>>> !alias.scope !3 >>>> 246003 %offset161 = add i32 %call56, 4 >>>> 246004 %12 = sext i32 %offset161 to i64 >>>> 246005 %maddr62 = getelementptr inbounds i8, i8* %mem_base60, i64 %12 >>>> 246006 %data_ptr63 = bitcast i8* %maddr62 to i64* >>>> **246007 store i64 0, i64* %data_ptr63, align 1, !noalias !3 >>>> **246008 %mem_base66 = load i8*, i8** %mem_base_addr_ptr, align 8, >>>> !alias.scope !3 >>>> 246009 %offset167 = add i32 %call56, 12 >>>> 246010 %13 = sext i32 %offset167 to i64 >>>> .... >>>> 382681 !3 = !{!3} >>>> 382682 !4 = !{!4} >>>> >>>> BR, >>>> Terry >>>> >>>> On Thu, Jul 23, 2020 at 11:43 PM Johannes Doerfert < >>>> johannesdoerfert at gmail.com> wrote: >>>> >>>>> Hi Terry, >>>>> >>>>> >>>>> various LLVM passes that run with O3 would do this for you, assuming >>>>> they could prove correctness. >>>>> >>>>> FWIW, the address is the same, so it is (most likely) an aliasing >>>>> problem. I assume >>>>> >>>>> store i64 0, i64* %data_ptr63, align 8 >>>>> >>>>> might clobber the loaded location so we do not reuse the first load. >>> You >>>>> use alias metadata in IR or >>>>> >>>>> `noalias` (in IR) [= `restrict` (in C/C++)] attributes for arguments to >>>>> help the alias analysis. >>>>> >>>>> >>>>> Is this what you were looking for? >>>>> >>>>> >>>>> ~ Johannes >>>>> >>>>> >>>>> On 7/23/20 10:25 AM, Terry Guo via llvm-dev wrote: >>>>>> Hi there, >>>>>> >>>>>> The raw input IR is composed by my tool and the below one is produced >>> by >>>>>> llvm opt tool with O3 optimization level. I am pretty sure that the >>> two >>>>>> load instructions( %mem_base60 and %mem_base66) are referring to the >>>>> same >>>>>> memory location. How can I instruct llvm optimization pass to optimize >>>>> out >>>>>> the %mem_base66 and make the subsequent code reuse the %mem_base60? >>> I >>>>>> tried with metadata 'alias.scope' and 'noalias' and it doesn't help. >>>>> Thanks >>>>>> for any advice. >>>>>> >>>>>> 392542 check_exce_succ59: ; preds >>>>>> %check_exce_succ40 >>>>>> **392543 %mem_base60 = load i8*, i8** %mem_base_addr_ptr, align 8 >>>>>> 392544 %offset161 = add i32 %call56, 4 >>>>>> 392545 %11 = sext i32 %offset161 to i64 >>>>>> 392546 %maddr62 = getelementptr inbounds i8, i8* %mem_base60, i64 >>> %11 >>>>>> 392547 %data_ptr63 = bitcast i8* %maddr62 to i64* >>>>>> 392548 store i64 0, i64* %data_ptr63, align 8 >>>>>> **392549 %mem_base66 = load i8*, i8** %mem_base_addr_ptr, align 8 >>>>>> 392550 %offset167 = add i32 %call56, 12 >>>>>> 392551 %12 = sext i32 %offset167 to i64 >>>>>> 392552 %maddr68 = getelementptr inbounds i8, i8* %mem_base66, i64 >>> %12 >>>>>> 392553 %data_ptr69 = bitcast i8* %maddr68 to i32* >>>>>> 392554 store i32 %call, i32* %data_ptr69, align 8 >>>>>> >>>>>> BR, >>>>>> Terry >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> LLVM Developers mailing list >>>>>> llvm-dev at lists.llvm.org >>>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev