Hi,<div><br></div><div>For the following case,</div><div><br></div><div><div>$ cat bad1.ll</div><div>target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S64"</div>
<div><br></div><div>define internal void @test(i32 %v) {</div><div>entry:</div><div>  %tmp = alloca i32, align 4</div><div>  store i32 %v, i32* %tmp, align 4</div><div>  %0 = bitcast i32* %tmp to <2 x i8>*</div><div>
  %1 = load <2 x i8>* %0, align 4</div><div>  ret void</div><div>}</div><div><br></div><div>I have the following failure message for command line "opt -sroa bad.ll -o bad.bc".</div><div><br></div><div><div>
$ opt -sroa bad.ll -o bad.bc</div><div>opt: llvm/lib/Transforms/Scalar/SROA.cpp:2063: llvm::Value* convertValue(const llvm::DataLayout&, llvm::IRBuilder<>&, llvm::Value*, llvm::Type*): Assertion `canConvertValue(DL, V->getType(), Ty) && "Value not convertable to type"' failed.</div>
<div>0  opt       0x08f44f52</div><div>1  opt       0x08f44bac</div><div>2            0xb7736400 __kernel_sigreturn + 0</div><div>3            0xb7736424 __kernel_vsyscall + 16</div><div>4  libc.so.6 0xb7482c8f gsignal + 79</div>
<div>5  libc.so.6 0xb74862b5 abort + 373</div><div>6  libc.so.6 0xb747b826 __assert_fail + 246</div><div>7  opt       0x08b109d7</div><div>8  opt       0x08b135ef</div><div>9  opt       0x08b13b15</div><div>10 opt       0x08b1fea4</div>
<div>11 opt       0x08b1d7e1</div><div>12 opt       0x08b1adbc</div><div>13 opt       0x08b11ec8</div><div>14 opt       0x08b18177</div><div>15 opt       0x08b182c5</div><div>16 opt       0x08b186fc</div><div>17 opt       0x08b19142</div>
<div>18 opt       0x08e62c4a llvm::FPPassManager::runOnFunction(llvm::Function&) + 306</div><div>19 opt       0x08e62dfe llvm::FPPassManager::runOnModule(llvm::Module&) + 114</div><div>20 opt       0x08e630cc llvm::MPPassManager::runOnModule(llvm::Module&) + 400</div>
<div>21 opt       0x08e635b6 llvm::PassManagerImpl::run(llvm::Module&) + 122</div><div>22 opt       0x08e63749 llvm::PassManager::run(llvm::Module&) + 39</div><div>23 opt       0x084556a5 main + 5635</div><div>24 libc.so.6 0xb746e113 __libc_start_main + 243</div>
<div>25 opt       0x08445bf1</div><div>Stack dump:</div><div>0.<span class="" style="white-space:pre">  </span>Program arguments: opt -sroa bad.ll -o bad.bc </div><div>1.<span class="" style="white-space:pre">   </span>Running pass 'Function Pass Manager' on module 'bad.ll'.</div>
<div>2.<span class="" style="white-space:pre">  </span>Running pass 'SROA' on function '@_Z7vstore2Dv2_cjPU10AS16776960c'</div><div>Aborted</div></div><div><br></div><div>Is it a bug in SROA?</div><div><br>
</div><div>With the following patch, it seems the problem can be fixed. Any idea?</div><div><br></div><div><div>diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp</div><div>index d95c855..696107a 100644</div>
<div>--- a/lib/Transforms/Scalar/SROA.cpp</div><div>+++ b/lib/Transforms/Scalar/SROA.cpp</div><div>@@ -2608,8 +2608,6 @@ private:</div><div>     assert(OldOp == OldPtr);</div><div>     IRBuilder<> IRB(&SI);</div>
<div> </div><div>-    if (VecTy)</div><div>-      return rewriteVectorizedStoreInst(IRB, SI, OldOp);</div><div>     Type *ValueTy = SI.getValueOperand()->getType();</div><div> </div><div>     uint64_t Size = EndOffset - BeginOffset;</div>
<div>@@ -2644,6 +2642,9 @@ private:</div><div>       return IsConvertable;</div><div>     }</div><div> </div><div>+    if (VecTy)</div><div>+      return rewriteVectorizedStoreInst(IRB, SI, OldOp);</div><div>+</div><div>     if (IntTy && ValueTy->isIntegerTy())</div>
<div>       return rewriteIntegerStore(IRB, SI);</div><div> </div></div><div>-- <br></div>Thanks,<div>-Jiangning</div><br>
</div>