<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=us-ascii">
<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:Verdana;
        panose-1:2 11 6 4 3 5 4 4 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";}
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;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Verdana","sans-serif";
        color:purple;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
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 lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple">Hi,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple">Attached please see a patch with the fix to the bug and the test.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple">I changed back the operations executed when extract(cast) is transformed to cast(extract). It uses the Builder class as before. In addition the result node is
 added to the Worklist, so all the previous extract users will become the new scalar cast users.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple">Looking forward to your feedback,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple">Anat<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana","sans-serif";color:purple"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Dmitry Babokin [mailto:babokin@gmail.com]
<br>
<b>Sent:</b> Monday, April 22, 2013 17:21<br>
<b>To:</b> Shemer, Anat<br>
<b>Cc:</b> llvm-commits<br>
<b>Subject:</b> Re: [llvm] r179786 - In the function InstCombiner::visitExtractElementInst() removed the limitation that extract is promoted over a cast only if the cast has only one use.<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">This commit introduces a regression. Please see bug <a href="http://llvm.org/bugs/show_bug.cgi?id=15818">http://llvm.org/bugs/show_bug.cgi?id=15818</a> for more details.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The illegal transformation is the following:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Before:<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">  %retval.i.i = bitcast <8 x float> %floatval.i.i to <8 x i32><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  %vf.i = bitcast <8 x i32> %retval.i.i to <8 x float><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  %aFOO_load20_offset_load_to_int32 = fptosi <8 x float> %vf.i to <8 x i32><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  %b_load28_to_int32 = fptosi float %b to i32<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  %sub_b_load28_to_int32_ = add i32 %b_load28_to_int32, -2<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  %v.i.i = extractelement <8 x i32> %aFOO_load20_offset_load_to_int32, i32 %sub_b_load28_to_int32_<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">After:<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">  %0 = extractelement <8 x float> %floatval.i.i, i32 %sub_b_load28_to_int32_<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  %b_load28_to_int32 = fptosi float %b to i32<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  %sub_b_load28_to_int32_ = add i32 %b_load28_to_int32, -2<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  %v.i.i = fptosi float %0 to i32<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Note that %sub_b_load28_to_int32_ use move before definition.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">-Dmitry<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Thu, Apr 18, 2013 at 9:56 PM, Anat Shemer <<a href="mailto:anat.shemer@intel.com" target="_blank">anat.shemer@intel.com</a>> wrote:<o:p></o:p></p>
<p class="MsoNormal">Author: ashemer<br>
Date: Thu Apr 18 14:56:44 2013<br>
New Revision: 179786<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=179786&view=rev" target="_blank">
http://llvm.org/viewvc/llvm-project?rev=179786&view=rev</a><br>
Log:<br>
In the function InstCombiner::visitExtractElementInst() removed the limitation that extract is promoted over a cast only if the cast has only one use.<br>
<br>
<br>
Added:<br>
    llvm/trunk/test/Transforms/InstCombine/vec_extract_2elts.ll<br>
Modified:<br>
    llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp<br>
<br>
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp?rev=179786&r1=179785&r2=179786&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp?rev=179786&r1=179785&r2=179786&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp Thu Apr 18 14:56:44 2013<br>
@@ -278,10 +278,10 @@ Instruction *InstCombiner::visitExtractE<br>
     } else if (CastInst *CI = dyn_cast<CastInst>(I)) {<br>
       // Canonicalize extractelement(cast) -> cast(extractelement)<br>
       // bitcasts can change the number of vector elements and they cost nothing<br>
-      if (CI->hasOneUse() && EI.hasOneUse() &&<br>
-          (CI->getOpcode() != Instruction::BitCast)) {<br>
-        Value *EE = Builder->CreateExtractElement(CI->getOperand(0),<br>
-                                                  EI.getIndexOperand());<br>
+      if (CI->hasOneUse() && (CI->getOpcode() != Instruction::BitCast)) {<br>
+        Value *EE = InsertNewInstWith(<br>
+                 ExtractElementInst::Create(CI->getOperand(0), EI.getIndexOperand()),<br>
+          *CI);<br>
         return CastInst::Create(CI->getOpcode(), EE, EI.getType());<br>
       }<br>
     }<br>
<br>
Added: llvm/trunk/test/Transforms/InstCombine/vec_extract_2elts.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/vec_extract_2elts.ll?rev=179786&view=auto" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/vec_extract_2elts.ll?rev=179786&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/InstCombine/vec_extract_2elts.ll (added)<br>
+++ llvm/trunk/test/Transforms/InstCombine/vec_extract_2elts.ll Thu Apr 18 14:56:44 2013<br>
@@ -0,0 +1,12 @@<br>
+; RUN: opt < %s -instcombine -S | FileCheck %s<br>
+<br>
+define void @test(<4 x i32> %v, i64 *%r1, i64 *%r2) {<br>
+;CHECK: %1 = extractelement <4 x i32> %v, i32 0<br>
+;CHECK: %2 = zext i32 %1 to i64<br>
+        %1 = zext <4 x i32> %v to <4 x i64><br>
+        %2 = extractelement <4 x i64> %1, i32 0<br>
+        store i64 %2, i64 *%r1<br>
+        store i64 %2, i64 *%r2<br>
+        ret void<br>
+}<br>
+<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited</p>

<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></body>
</html>