<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Consolas","serif";
        color:black;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor="white" lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">If you produced the .ll file with a command line along the lines of `clang –c –O0 –emit-llvm …` then the IR functions will be annotated with the `optnone` attribute.
 If you don't want that, a better command line would be `clang –c –O2 –Xclang –disable-llvm-passes –emit-llvm …`<o:p></o:p></span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">--paulr<o:p></o:p></span></a></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext"> llvm-dev [mailto:llvm-dev-bounces@lists.llvm.org]
<b>On Behalf Of </b>Pedro Olsen Ferreira via llvm-dev<br>
<b>Sent:</b> Monday, February 25, 2019 6:28 AM<br>
<b>To:</b> llvm-dev@lists.llvm.org<br>
<b>Subject:</b> Re: [llvm-dev] Why is there still ineffective code after -o3 optimization?<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">You're asking LLVM not to optimise that function:<br>
<br>
<br>
<o:p></o:p></p>
<pre>define void @_Z27entityMainDataInputCallbackdRd(double %input, double*<o:p></o:p></pre>
<pre>dereferenceable(8) %o0) local_unnamed_addr <b>#0<o:p></o:p></b></pre>
<pre><b><o:p> </o:p></b></pre>
<pre>where the attribute list is defined as:<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>attributes #0 = { noinline nounwind <b>optnone</b> uwtable<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Removing "optnone" yields what you'd expect.<o:p></o:p></pre>
<p class="MsoNormal" style="margin-bottom:12.0pt"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On 25/02/2019 14:09, alexp via llvm-dev wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>Hi,<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>I have some IR module from random generation (mostly ineffective<o:p></o:p></pre>
<pre>instructions).<o:p></o:p></pre>
<pre>It has a function with void return, and two function arguments where one<o:p></o:p></pre>
<pre>is a reference.<o:p></o:p></pre>
<pre>Therefore, I expect every instruction not altering the value at the 2nd<o:p></o:p></pre>
<pre>arguments address should be ineffective.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Here is the function definition (see below for full ll):<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>define void @_Z27entityMainDataInputCallbackdRd(double %input, double*<o:p></o:p></pre>
<pre>dereferenceable(8) %o0) local_unnamed_addr #0 {<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>The ll below has been optimized using opt -O3 -S input.ll -o out.ll<o:p></o:p></pre>
<pre>The cfg is plotted as png here:<o:p></o:p></pre>
<pre><a href="https://ibb.co/f1B0rnm">https://ibb.co/f1B0rnm</a><o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>My question is: why is there still some unnecessary 'lint' in the<o:p></o:p></pre>
<pre>optimization result?<o:p></o:p></pre>
<pre>E.G. from the splittedblock19 onwards:<o:p></o:p></pre>
<pre>there is one effective instruction<o:p></o:p></pre>
<pre>store double 0x3FF787378698A951, double* %o0<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>everything what follows (conditional branch, splittedblock38, 21, 42)<o:p></o:p></pre>
<pre>could safely be removed (just leaving a 'ret void' after the store<o:p></o:p></pre>
<pre>instruction).<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Why is this not removed?<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Is there a pass (combination) which could remove all the ineffective<o:p></o:p></pre>
<pre>instructions?<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Thanks<o:p></o:p></pre>
<pre>Alex<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre>//======================================================<o:p></o:p></pre>
<pre>//=== full ll below<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre>; ModuleID = '0.1.800866.ll'<o:p></o:p></pre>
<pre>source_filename = "entityMain.cpp"<o:p></o:p></pre>
<pre>target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<o:p></o:p></pre>
<pre>target triple = "x86_64-unknown-linux-gnu"<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>; Function Attrs: noinline nounwind optnone uwtable<o:p></o:p></pre>
<pre>define void @_Z27entityMainDataInputCallbackdRd(double %input, double*<o:p></o:p></pre>
<pre>dereferenceable(8) %o0) local_unnamed_addr #0 {<o:p></o:p></pre>
<pre>entry:<o:p></o:p></pre>
<pre>  %input.addr = alloca double, align 8<o:p></o:p></pre>
<pre>  %o0.addr = alloca double*, align 8<o:p></o:p></pre>
<pre>  %ui = alloca i32, align 4<o:p></o:p></pre>
<pre>  store double %input, double* %input.addr, align 8<o:p></o:p></pre>
<pre>  %0 = fptoui double %input to i64<o:p></o:p></pre>
<pre>  %1 = fptrunc double %input to float<o:p></o:p></pre>
<pre>  %2 = mul i64 %0, %0<o:p></o:p></pre>
<pre>  %3 = fptrunc double %input to float<o:p></o:p></pre>
<pre>  %4 = mul i64 %0, %0<o:p></o:p></pre>
<pre>  %5 = fsub float %3, %3<o:p></o:p></pre>
<pre>  store double* %o0, double** %o0.addr<o:p></o:p></pre>
<pre>  %6 = and i64 %0, %0<o:p></o:p></pre>
<pre>  %7 = fptoui float %3 to i1<o:p></o:p></pre>
<pre>  %8 = ashr i1 %7, %7<o:p></o:p></pre>
<pre>  store double* null, double** %o0.addr<o:p></o:p></pre>
<pre>  %9 = fptosi double %input to i64<o:p></o:p></pre>
<pre>  %10 = shl i1 %7, %7<o:p></o:p></pre>
<pre>  %11 = sitofp i1 %8 to float<o:p></o:p></pre>
<pre>  %12 = icmp uge i64 %6, %4<o:p></o:p></pre>
<pre>  %13 = and i64 %0, %6<o:p></o:p></pre>
<pre>  %14 = fcmp ole float %11, %11<o:p></o:p></pre>
<pre>  %15 = ashr i1 %10, %7<o:p></o:p></pre>
<pre>  %16 = sext i1 %10 to i64<o:p></o:p></pre>
<pre>  %17 = ashr i1 %7, %12<o:p></o:p></pre>
<pre>  %18 = alloca [2 x double]<o:p></o:p></pre>
<pre>  %19 = fcmp true float %11, %3<o:p></o:p></pre>
<pre>  br label %splittedblock7<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock7:                                   ; preds = %entry<o:p></o:p></pre>
<pre>  %20 = select i1 %8, i1 %17, i1 %19<o:p></o:p></pre>
<pre>  %21 = fptoui float %1 to i1<o:p></o:p></pre>
<pre>  br label %splittedblock1<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock1:                                   ; preds = %splittedblock7<o:p></o:p></pre>
<pre>  %22 = fptrunc double %input to float<o:p></o:p></pre>
<pre>  %23 = shl i1 %17, %20<o:p></o:p></pre>
<pre>  %24 = fsub float %5, %5<o:p></o:p></pre>
<pre>  br label %splittedblock35<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock36:                                  ; preds = %splittedblock10<o:p></o:p></pre>
<pre>  br label %splittedblock15<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock38:                                  ; preds = %splittedblock19<o:p></o:p></pre>
<pre>  br label %splittedblock21<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock10:                                  ; preds = %splittedblock35<o:p></o:p></pre>
<pre>  br label %splittedblock36<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock35:                                  ; preds = %splittedblock1<o:p></o:p></pre>
<pre>  br i1 %12, label %splittedblock14, label %splittedblock10<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock14:                                  ; preds = %splittedblock35<o:p></o:p></pre>
<pre>  br label %splittedblock19<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock19:                                  ; preds = %splittedblock14<o:p></o:p></pre>
<pre>  store double 0x3FF787378698A951, double* %o0<o:p></o:p></pre>
<pre>  br i1 %23, label %splittedblock38, label %splittedblock42<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock42:                                  ; preds =<o:p></o:p></pre>
<pre>%splittedblock21, %splittedblock19<o:p></o:p></pre>
<pre>  ret void<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock15:                                  ; preds = %splittedblock36<o:p></o:p></pre>
<pre>  ret void<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock21:                                  ; preds = %splittedblock38<o:p></o:p></pre>
<pre>  %25 = xor i64 %6, %4<o:p></o:p></pre>
<pre>  br label %splittedblock42<o:p></o:p></pre>
<pre>}<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>; Function Attrs: norecurse nounwind readnone<o:p></o:p></pre>
<pre>define <2 x double> @func_3701811888700380719897139(...)<o:p></o:p></pre>
<pre>local_unnamed_addr #1 {<o:p></o:p></pre>
<pre>entry:<o:p></o:p></pre>
<pre>  ret <2 x double> <double 0xC00934F9D7726A00, double 0xFFCFDA8E9AFFB51D><o:p></o:p></pre>
<pre>}<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>; Function Attrs: norecurse noreturn nounwind readnone<o:p></o:p></pre>
<pre>define { double, double } @func_0065559471331315590586(...)<o:p></o:p></pre>
<pre>local_unnamed_addr #2 {<o:p></o:p></pre>
<pre>entry:<o:p></o:p></pre>
<pre>  br label %splittedblock1<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>splittedblock1:                                   ; preds = %entry,<o:p></o:p></pre>
<pre>%splittedblock1<o:p></o:p></pre>
<pre>  br label %splittedblock1<o:p></o:p></pre>
<pre>}<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>attributes #0 = { noinline nounwind optnone uwtable<o:p></o:p></pre>
<pre>"correctly-rounded-divide-sqrt-fp-math"="false"<o:p></o:p></pre>
<pre>"disable-tail-calls"="false" "less-precise-fpmad"="false"<o:p></o:p></pre>
<pre>"no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"<o:p></o:p></pre>
<pre>"no-infs-fp-math"="false" "no-jump-tables"="false"<o:p></o:p></pre>
<pre>"no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false"<o:p></o:p></pre>
<pre>"no-trapping-math"="false" "stack-protector-buffer-size"="8"<o:p></o:p></pre>
<pre>"target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87"<o:p></o:p></pre>
<pre>"unsafe-fp-math"="false" "use-soft-float"="false" }<o:p></o:p></pre>
<pre>attributes #1 = { norecurse nounwind readnone }<o:p></o:p></pre>
<pre>attributes #2 = { norecurse noreturn nounwind readnone }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>!llvm.module.flags = !{!0, !1}<o:p></o:p></pre>
<pre>!llvm.ident = !{!2}<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>!0 = !{i32 1, !"wchar_size", i32 4}<o:p></o:p></pre>
<pre>!1 = !{i32 7, !"PIC Level", i32 2}<o:p></o:p></pre>
<pre>!2 = !{!"clang version 7.0.1 (branches/release_70 348238)"}<o:p></o:p></pre>
<pre>_______________________________________________<o:p></o:p></pre>
<pre>LLVM Developers mailing list<o:p></o:p></pre>
<pre><a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><o:p></o:p></pre>
<pre><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><o:p></o:p></pre>
</blockquote>
<p class="MsoNormal"><br>
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose,
 or store or copy the information in any medium. Thank you. <o:p></o:p></p>
</div>
</div>
</body>
</html>