[llvm-dev] How to optimize out the duplicated memory load instructions?
Terry Guo via llvm-dev
llvm-dev at lists.llvm.org
Thu Jul 23 09:15:05 PDT 2020
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>
More information about the llvm-dev
mailing list