<div dir="ltr"><div>Hi all,</div><div><br></div><div>I used LLVM's SLP vectorization pass and set the vector register width to 64. LLVM vectorizes A,B into E. </div><div><br></div><div>The question is regarding aliasing, where before vectorization LLVM returns that both A and B do not alias with C individually. But after vectorization LLVM returns that E which is the vectorized value of A and B does alias with D (same as C). </div><div><br></div><div>Can this happen and why is LLVM's alias analysis returning they are infact aliased?</div><div><br></div><div>Thank You!</div><div><br></div><div><b>Before vectorization</b></div><div><br></div><div>entry:</div><div>  %0 = bitcast %"class.internal::BlockVectorIterators::Iterator"* %c to i64*</div><div>  %1 = load i64, i64* %0, align 8, !tbaa !2</div><div>  %2 = bitcast %"class.internal::BlockVectorIterators::Iterator"* %this to i64*</div><div>  store i64 %1, i64* %2, align 8, !tbaa !2</div><div>  %global_index = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 1</div><div> A:<span style="background-color:rgb(255,255,0)"> %3 = load i32, i32* %global_index, align 8, !tbaa !8</span></div><div>  %global_index3 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 1</div><div>  store i32 %3, i32* %global_index3, align 8, !tbaa !8</div><div>  %index_within_block = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 3</div><div>  %4 = load i32, i32* %index_within_block, align 8, !tbaa !9</div><div>  %index_within_block4 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 3</div><div> C: <span style="background-color:rgb(0,255,255)">store i32 %4, i32* %index_within_block4, align 8, !tbaa !9</span></div><div>  %current_block = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 2</div><div> B: <span style="background-color:rgb(255,255,0)">%5 = load i32, i32* %current_block, align 4, !tbaa !10</span></div><div>  %current_block5 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 2</div><div>  store i32 %5, i32* %current_block5, align 4, !tbaa !10</div><div>  %next_break_forward = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 4</div><div>  %6 = load i32, i32* %next_break_forward, align 4, !tbaa !11</div><div>  %next_break_forward6 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 4</div><div>  store i32 %6, i32* %next_break_forward6, align 4, !tbaa !11</div><div>  %next_break_backward = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 5</div><div>  %7 = load i32, i32* %next_break_backward, align 8, !tbaa !12</div><div>  %next_break_backward7 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 5</div><div>  store i32 %7, i32* %next_break_backward7, align 8, !tbaa !12</div><div>  ret %"class.internal::BlockVectorIterators::Iterator"* %this</div><div><br></div><div><br></div><div><b>After vectorization</b></div><div><br></div><div><div>entry:</div><div>  %0 = bitcast %"class.internal::BlockVectorIterators::Iterator"* %c to i64*</div><div>  %1 = load i64, i64* %0, align 8, !tbaa !2</div><div>  %2 = bitcast %"class.internal::BlockVectorIterators::Iterator"* %this to i64*</div><div>  store i64 %1, i64* %2, align 8, !tbaa !2</div><div>  %global_index = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 1</div><div>  %global_index3 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 1</div><div>  %index_within_block = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 3</div><div>  %3 = load i32, i32* %index_within_block, align 8, !tbaa !8</div><div>  %index_within_block4 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 3</div><div>D: <span style="background-color:rgb(0,255,255)"> store i32 %3, i32* %index_within_block4, align 8, !tbaa !8</span></div><div>  %current_block = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 2</div><div>  %4 = bitcast i32* %global_index to <2 x i32>*</div><div>E: <span style="background-color:rgb(255,255,0)"> %5 = load <2 x i32>, <2 x i32>* %4, align 8, !tbaa !9</span></div><div>  %current_block5 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 2</div><div>  %6 = bitcast i32* %global_index3 to <2 x i32>*</div><div>  store <2 x i32> %5, <2 x i32>* %6, align 8, !tbaa !9</div><div>  %next_break_forward = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 4</div><div>  %7 = load i32, i32* %next_break_forward, align 4, !tbaa !10</div><div>  %next_break_forward6 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 4</div><div>  store i32 %7, i32* %next_break_forward6, align 4, !tbaa !10</div><div>  %next_break_backward = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %c, i64 0, i32 5</div><div>  %8 = load i32, i32* %next_break_backward, align 8, !tbaa !11</div><div>  %next_break_backward7 = getelementptr inbounds %"class.internal::BlockVectorIterators::Iterator", %"class.internal::BlockVectorIterators::Iterator"* %this, i64 0, i32 5</div><div>  store i32 %8, i32* %next_break_backward7, align 8, !tbaa !11</div><div>  ret %"class.internal::BlockVectorIterators::Iterator"* %this</div></div><div><br></div><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div>Kind regards,<br>Charith Mendis<br><br>Graduate Student,<div>CSAIL,<br><div>Massachusetts Institute of Technology</div></div></div></div></div>
</div>