[llvm-dev] Question of visitStoreInst in SROA pass

xuruobin via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 26 00:00:43 PDT 2019

Hi all,

  I have a testcase whose result is different in O0 and O2 under llvm-4.0.0 version(trunk version also gets different result).
typedef int int128 __attribute__ ((vector_size (16)));
int main () {
             long long int except = 0x1234567800000000;
             int err=0;
             long long a = 0x1234567812345678;
             int128 *b = (int128 *) &a;
             (*b)[0] = 0;
             if (a != except)
             if (err)
                 printf("not equal\n");
             return 0;
O0 printed equal and O2 printed not equal. After some debugging, I found SROA pass changed the codes' semantics. Here are IR during SROA
  %a = alloca i64, align 8
  %0 = bitcast i64* %a to i8*
  call void @llvm.lifetime.start(i64 8, i8* %0) #2
  store i64 1311768465173141112, i64* %a, align 8, !tbaa !1
  %1 = bitcast i64* %a to <4 x i32>*
  %2 = load <4 x i32>, <4 x i32>* %1, align 16
  %vecins = insertelement <4 x i32> %2, i32 0, i32 0
  store <4 x i32> %vecins, <4 x i32>* %1, align 16
  %3 = load i64, i64* %a, align 8, !tbaa !1
  %cmp = icmp ne i64 %3, 1311768464867721216
  br i1 %cmp, label %if.then, label %if.end
But visitStoreInst will check whether Size(4 x i32 = 128) is greater than AllocaSize(64) and if so, mark the store inst(`store <4 x i32> %vecins, <4 x i32>* %1, align 16`) dead and delete it. My intension is to change lower 32bits of b and store it back but the compiler thinks I will store all 128 bits. Is that a bug? Or if it's test case problem, I think compiler can at least report some warnings in stdout(currently only reports warning in debug log).

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190826/2a78ecc7/attachment.html>

More information about the llvm-dev mailing list