[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 08:48:06 PDT 2020


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/20200723/df59fd46/attachment.html>


More information about the llvm-dev mailing list