<div dir="ltr">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.<div><br></div><div style>The illegal transformation is the following:</div>
<div style>Before:</div><div style><div>  %retval.i.i = bitcast <8 x float> %floatval.i.i to <8 x i32></div><div>  %vf.i = bitcast <8 x i32> %retval.i.i to <8 x float></div><div>  %aFOO_load20_offset_load_to_int32 = fptosi <8 x float> %vf.i to <8 x i32></div>
<div>  %b_load28_to_int32 = fptosi float %b to i32</div><div>  %sub_b_load28_to_int32_ = add i32 %b_load28_to_int32, -2</div><div>  %v.i.i = extractelement <8 x i32> %aFOO_load20_offset_load_to_int32, i32 %sub_b_load28_to_int32_</div>
<div style>After:</div><div style><div>  %0 = extractelement <8 x float> %floatval.i.i, i32 %sub_b_load28_to_int32_</div><div>  %b_load28_to_int32 = fptosi float %b to i32</div><div>  %sub_b_load28_to_int32_ = add i32 %b_load28_to_int32, -2</div>
<div>  %v.i.i = fptosi float %0 to i32</div><div><br></div><div style>Note that %sub_b_load28_to_int32_ use move before definition.</div><div style><br></div><div style>-Dmitry</div><div><br></div></div></div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Thu, Apr 18, 2013 at 9:56 PM, Anat Shemer <span dir="ltr"><<a href="mailto:anat.shemer@intel.com" target="_blank">anat.shemer@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
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><br>
</blockquote></div><br></div>