<p dir="ltr">FYI, on vacation and then at a conference but will actually look at this on Monday next week.</p>
<br><div class="gmail_quote">On Thu, Apr 23, 2015, 18:31 Daniel Stewart <<a href="mailto:stewartd@codeaurora.org">stewartd@codeaurora.org</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I think I can solve this by both adding BitCast checks to the loads, in addition to the Stores, and also checking the Stores to ensure they are fed by a Load and that the Load only feeds it. I’ll test this solution some more and try to make a patch. <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Daniel<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p><div><div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in"><p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> <a href="mailto:llvmdev-bounces@cs.uiuc.edu" target="_blank">llvmdev-bounces@cs.uiuc.edu</a> [mailto:<a href="mailto:llvmdev-bounces@cs.uiuc.edu" target="_blank">llvmdev-bounces@cs.uiuc.edu</a>] <b>On Behalf Of </b>Daniel Stewart<br><b>Sent:</b> Thursday, April 23, 2015 9:17 AM</span></p></div></div></div></div><div lang="EN-US" link="blue" vlink="purple"><div><div><div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in"><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><br><b>To:</b> 'Pete Cooper'<br><b>Cc:</b> 'LLVM Developers Mailing List'<br><b>Subject:</b> Re: [LLVMdev] RFC: Missing canonicalization in LLVM<u></u><u></u></span></p></div></div></div></div><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Thanks for the reply Pete. Unfortunately, I don’t think it is going to be as simple as ignoring those loads which only store. In findCommonType(), only one alloca is passed in at a time. So, while you could find those cases where that alloca was loaded from and stored elsewhere, you can’t find those places that store to that alloca from somewhere else (at least not easily that I can see). <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">So in my particular example, I could catch the case of only load -> store. However, there are other stores that use the alloca address, but it is not readily apparent if they come directly & only from a load. <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Still trying to figure out the best way forward.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Daniel<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p><div><div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in"><p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Pete Cooper [<a href="mailto:peter_cooper@apple.com" target="_blank">mailto:peter_cooper@apple.com</a>] <br><b>Sent:</b> Tuesday, April 21, 2015 2:00 PM<br><b>To:</b> Daniel Stewart<br><b>Cc:</b> LLVM Developers Mailing List; Chandler Carruth<br><b>Subject:</b> Re: [LLVMdev] RFC: Missing canonicalization in LLVM<u></u><u></u></span></p></div></div><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Hi Daniel<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Thanks for the excellent breakdown of whats going on here.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Earlier in the thread on this I made this comment:<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><blockquote style="margin-left:30.0pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt"><div><p class="MsoNormal">"The first thing that springs to mind is that I don’t trust the backend to get this right.  I don’t think it will understand when an i32 load/store would have been preferable to a float one or vice versa.  I have no evidence of this, but given how strongly typed tablegen is, I don’t think it can make a good choice here.<u></u><u></u></p></div><div><div><p class="MsoNormal"><u></u> <u></u></p></div></div><div><div><p class="MsoNormal">So I think we probably need to teach the backend how to undo whatever canonical form we choose if it has a reason to”<u></u><u></u></p></div></div></blockquote><div><p class="MsoNormal"><u></u> <u></u></p></div><p class="MsoNormal">Without seeing the machine instructions, its hard to be 100% certain, but the case you’ve found may be simple enough that the backend can actually fix this. However, such a fixup would be quite target specific (such a target would need different register classes for integers and doubles in this case), and we’d need such a pass for all targets which isn’t ideal.<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">So i wouldn’t rule out a backend solution, but i have a preference for your suggestion to improve SROA.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">In this particular case, it makes sense for SROA to do effectively the same analysis InstCombine did here and work out when a load is just raw data vs when its data is used as a specific type.  The relevant piece of InstCombine is this:<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#008400">// Try to canonicalize loads which are only ever stored to operate over<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif;color:black">  </span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#008400">// integers instead of any other type. We only do this when the loaded type<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif;color:black">  </span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#008400">// is sized and has a size exactly the same as its store size and the store<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif;color:black">  </span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#008400">// size is a legal integer type.<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif">  <span style="color:#bb2ca2">if</span> (!Ty-><span style="color:#31595d">isIntegerTy</span>() && Ty-><span style="color:#31595d">isSized</span>() &&<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif;color:black">      DL.</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#31595d">isLegalInteger</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:black">(DL.</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#31595d">getTypeStoreSizeInBits</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:black">(Ty)) &&</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#31595d"><u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif;color:black">      DL.</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#31595d">getTypeStoreSizeInBits</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:black">(Ty) == DL.</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#31595d">getTypeSizeInBits</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:black">(Ty)) {</span><span style="font-size:8.5pt;font-family:"Menlo",serif;color:#31595d"><u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif">    <span style="color:#bb2ca2">if</span> (<span style="color:#703daa">std</span>::<span style="color:#3d1d81">all_of</span>(LI.<span style="color:#31595d">user_begin</span>(), LI.<span style="color:#31595d">user_end</span>(), [&LI](<span style="color:#4f8187">User</span> *U) {<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif">          <span style="color:#bb2ca2">auto</span> *SI = <span style="color:#31595d">dyn_cast</span><<span style="color:#4f8187">StoreInst</span>>(U);<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif">          <span style="color:#bb2ca2">return</span> SI && SI-><span style="color:#31595d">getPointerOperand</span>() != &LI;<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif">        })) {<u></u><u></u></span></p></div></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:"Menlo",serif">...<u></u><u></u></span></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">After ignoring load/stores which satisfy something like the above code, you can always fallback to the current code of choosing an integer type, so in the common case there won’t be any behavior difference.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Cheers<u></u><u></u></p></div><div><p class="MsoNormal">Pete<u></u><u></u></p><div><div><blockquote style="margin-top:5.0pt;margin-bottom:5.0pt"><div><p class="MsoNormal">On Apr 21, 2015, at 9:18 AM, Daniel Stewart <<a href="mailto:stewartd@codeaurora.org" target="_blank">stewartd@codeaurora.org</a>> wrote:<u></u><u></u></p></div><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">So this change did indeed have an effect!<span> </span></span><span style="font-size:11.0pt;font-family:Wingdings;color:#1f497d">J</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I’m seeing regressions in a number of benchmarks mainly due to a host of extra bitcasts that get introduced. Here’s the problem I’m seeing in a nutshell:</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">1)      There is a Phi with input type double</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">2)      Polly demotes the phi into a load/store of type double</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">3)      InstCombine canonicalizes the load/store to use i64 instead of double</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">4)      SROA removes the load/store & inserts a phi back in, using i64 as the type. Inserts bitcast to get to double.</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">5)      The bitcast sticks around and eventually get translated into FMOVs (for AArch64 at least).</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">The function findCommonType() in SROA.cpp is used to obtain the type that should be used for the new alloca that SROA wants to create. It’s decision process is essentially – if all loads/stores of alloca are the same, use that type; else use the corresponding integer type. This causes bitcasts to be inserted in a number of places, most all of which stick around.<span> </span></span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I’ve copied a reduced version of an instance of the problem below. I’m looking for comments on what others think is the right solution here. Make SROA more intelligent about picking the type?<span> </span></span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">The code is below with all unnecessary code removed for easy consumption.<span> </span></span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Daniel</span><u></u><u></u></p></div><div><p class="MsoNormal"><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">Before<span> </span></span></u><u><span style="font-size:11.0pt;font-family:"Courier New";color:#212121">Polly – Prepare code for polly</span></u><span><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span></u></span><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">we have code that looks like:</span></u><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">while.cond473:                                    ; preds = %while.cond473.outer78, %while.body475</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> <span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0">%p_j_x452.0</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0"> </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">= phi double [<span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red">%105</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">, %while.body475 ], [ %p_j_x452.0.ph82, %while.cond473.outer78 ]</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">while.body475:                                    ; preds = %while.cond473</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %sub480 = fsub fast double %64,<span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0">%p_j_x452.0</span></b><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> <span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red">%105</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red"> </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">= load double* %x485, align 8, !tbaa !25</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">After<span> </span></span></u><u><span style="font-size:11.0pt;font-family:"Courier New";color:#212121">Polly – Prepare code for polly</span></u><span><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span></u></span><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">we have:</span></u><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">while.cond473:                                    ; preds = %while.cond473.outer78, %while.body475</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> <span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0">%p_j_x452.0.reload</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0"> </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">= load double* %p_j_x452.0.reg2mem</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">while.body475:                                    ; preds = %while.cond473</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %sub480 = fsub fast double %64,<span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0">%p_j_x452.0.reload</span></b><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> <span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red">%110</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red"> </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">= load double* %x485, align 8, !tbaa !25</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  store double<span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red">%110</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">, double* %p_j_x452.0.reg2mem</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">After<span> </span></span></u><u><span style="font-size:11.0pt;font-family:"Courier New";color:#212121">Combine redundant instructions</span></u><span><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span></u></span><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">:</span></u><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">while.cond473:                                    ; preds = %while.cond473.outer78, %while.body475</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> <span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0">%p_j_x452.0.reload</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0"> </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">= load double* %p_j_x452.0.reg2mem, align 8</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">while.body475:                                    ; preds = %while.cond473</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %sub480 = fsub fast double %74,<span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0">%p_j_x452.0.reload</span></b><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %x485 = getelementptr inbounds %struct.CompAtom* %15, i64 %idxprom482, i32 0, i32 0</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %194 = bitcast double* %x485 to i64*</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> <span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red">%195</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red"> </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">= load i64* %194, align 8, !tbaa !25</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %200 = bitcast double* %p_j_x452.0.reg2mem to i64*</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  store i64<span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red">%195</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">, i64* %200, align 8</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">After<span> </span></span></u><u><span style="font-size:11.0pt;font-family:"Courier New";color:#212121">SROA</span></u><span><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span></u></span><u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">:</span></u><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">while.cond473:                                    ; preds = %while.cond473.outer78, %while.body475</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %p_j_x452.0.reg2mem.sroa.0.0.p_j_x452.0.reload362 = phi i64 [ %p_j_x452.0.ph73.reg2mem.sroa.0.0.load368, %while.cond473.outer78 ], [<span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red">%178</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">, %while.body475 ]</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> <span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0">%173</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0"> </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">= bitcast i64 %p_j_x452.0.reg2mem.sroa.0.0.p_j_x452.0.reload362 to double</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">while.body475:                                    ; preds = %while.cond473</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %sub480 = fsub fast double %78,<span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#0070c0">%173</span></b><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %x485 = getelementptr inbounds %struct.CompAtom* %15, i64 %idxprom482, i32 0, i32 0</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">  %177 = bitcast double* %x485 to i64*</span><u></u><u></u></p></div><div style="border:none;border-bottom:solid windowtext 1.0pt;padding:0in 0in 1.0pt 0in"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> <span> </span></span><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red">%178</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:red"> </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121">= load i64* %177, align 8, !tbaa !25</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#212121"> </span><u></u><u></u></p></div></div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span></span><a href="mailto:llvmdev-bounces@cs.uiuc.edu" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:purple">llvmdev-bounces@cs.uiuc.edu</span></a><span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">[</span><a href="mailto:llvmdev-bounces@cs.uiuc.edu" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:purple">mailto:llvmdev-bounces@cs.uiuc.edu</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">]<span> </span><b>On Behalf Of<span> </span></b>Chandler Carruth<br><b>Sent:</b><span> </span>Wednesday, January 21, 2015 8:32 PM<br><b>To:</b><span> </span>Pete Cooper<br><b>Cc:</b><span> </span>LLVM Developers Mailing List<br><b>Subject:</b><span> </span>Re: [LLVMdev] RFC: Missing canonicalization in LLVM</span><u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><div><p class="MsoNormal">On Wed, Jan 21, 2015 at 3:06 PM, Pete Cooper <<a href="mailto:peter_cooper@apple.com" target="_blank"><span style="color:purple">peter_cooper@apple.com</span></a>> wrote:<u></u><u></u></p></div><blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt"><div><p class="MsoNormal">Sounds good to me.  Integers it is then.<u></u><u></u></p></div></blockquote></div><div><p class="MsoNormal"><br>FYI, thanks, I'm just going to commit this then. It seems we're all in essential agreement. We can revert it and take a more cautious approach if something terrible happens. =]<u></u><u></u></p></div></div></div></div></blockquote></div><p class="MsoNormal"><u></u> <u></u></p></div></div></div></div>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div>