Test Failure: Transforms/SROA/basictest.ll

Test source: git

Comments: LLVM bug: memcpy -> load/store

Log:

Source: <stdin>
ERROR: Unsupported instruction:   %B = addrspacecast [8 x i8]* %A to i64 addrspace(1)*
ERROR: Unsupported instruction:   %B = addrspacecast [256 x i8]* %A to i64 addrspace(1)*
ERROR: Unsupported instruction:   %B = addrspacecast [256 x i8]* %A to i64 addrspace(1)*
ERROR: Unsupported metadata: 1
ERROR: Unsupported metadata: 1
ERROR: Unsupported instruction:   %fptr.as1 = addrspacecast float* %fptr to float addrspace(1)*
ERROR: Unsupported metadata: 1
ERROR: Unsupported metadata: 1
ERROR: Unsupported metadata: 1
ERROR: Unsupported metadata: 1
ERROR: Unsupported metadata: 1
ERROR: Unsupported instruction:   %cast1 = addrspacecast %opaque* %x to i8 addrspace(1)*
ERROR: Unsupported instruction:   %cond.in = select i1 %a, i64* %c, i64* %p.0.c
ERROR: Unsupported metadata: 1
ERROR: Unsupported instruction:   store volatile i16 42, i16* %a.cast, align 2
ERROR: Unsupported instruction:   store volatile i16 42, i16* %a.cast2, align 2
ERROR: Unsupported instruction:   store atomic volatile i64 0, i64* %ptr seq_cst, align 8

----------------------------------------
define i32 @test0() {
%entry:
  %a1 = alloca i64 4, align 4, dead
  %a2 = alloca i64 4, align 4, dead
  %a1.i8 = bitcast ptr %a1 to ptr
  start_lifetime ptr %a1.i8
  store i32 0, ptr %a1, align 4
  %v1 = load i32, ptr %a1, align 4
  free ptr %a1.i8 unconstrained
  %a2.i8 = bitcast ptr %a2 to ptr
  start_lifetime ptr %a2.i8
  store float 0.000000, ptr %a2, align 4
  %v2 = load float, ptr %a2, align 4
  %v2.int = bitcast float %v2 to i32
  %sum1 = add i32 %v1, %v2.int
  free ptr %a2.i8 unconstrained
  ret i32 %sum1
}
=>
define i32 @test0() {
%entry:
  %v2.int = bitcast float 0.000000 to i32
  %sum1 = add i32 0, %v2.int
  ret i32 %sum1
}
Transformation seems to be correct!


----------------------------------------
define i32 @test1() {
%entry:
  %X = alloca i64 8, align 8
  %Y = gep ptr %X, 8 x i64 0, 1 x i64 0
  store i32 0, ptr %Y, align 4
  %Z = load i32, ptr %Y, align 4
  ret i32 %Z
}
=>
define i32 @test1() {
%entry:
  ret i32 0
}
Transformation seems to be correct!


----------------------------------------
define i64 @test2(i64 %X) {
%entry:
  %A = alloca i64 8, align 1
  %B = bitcast ptr %A to ptr
  store i64 %X, ptr %B, align 4
  br label %L2

%L2:
  %Z = load i64, ptr %B, align 4
  ret i64 %Z
}
=>
define i64 @test2(i64 %X) {
%entry:
  br label %L2

%L2:
  ret i64 %X
}
Transformation seems to be correct!

ERROR: Unsupported instruction:   %A.sroa.0.2.gepB.sroa_cast = addrspacecast i8* %A.sroa.0.2.gepB.sroa_idx to i64 addrspace(1)*
ERROR: Unsupported metadata: 1
ERROR: Unsupported metadata: 1

----------------------------------------
define i16 @test5() {
%entry:
  %a = alloca i64 4, align 1
  %fptr = bitcast ptr %a to ptr
  store float 0.000000, ptr %fptr, align 4
  %ptr = gep ptr %a, 4 x i32 0, 1 x i32 2
  %iptr = bitcast ptr %ptr to ptr
  %val = load i16, ptr %iptr, align 2
  ret i16 %val
}
=>
define i16 @test5() {
%entry:
  %0 = bitcast float 0.000000 to i32
  %a.sroa.0.2.extract.shift = lshr i32 %0, 16
  %a.sroa.0.2.extract.trunc = trunc i32 %a.sroa.0.2.extract.shift to i16
  ret i16 %a.sroa.0.2.extract.trunc
}
Transformation seems to be correct!

ERROR: Unsupported instruction:   store volatile i32 707406378, i32* %a.sroa.0, align 4
ERROR: Unsupported instruction:   %a.sroa.0.0.copyload = load volatile i32, i32* %a.sroa.0.0.src.sroa_cast, align 1, !tbaa !0
ERROR: Unsupported metadata: 1

----------------------------------------
define i64 @test9() {
%entry:
  %a = alloca i64 3, align 8
  %gep1 = gep inbounds ptr %a, 3 x i32 0, 1 x i64 0, 1 x i32 0
  store i8 0, ptr %gep1, align 1
  %gep2 = gep inbounds ptr %a, 3 x i32 0, 1 x i64 0, 1 x i32 1
  store i8 0, ptr %gep2, align 1
  %gep3 = gep inbounds ptr %a, 3 x i32 0, 1 x i64 0, 1 x i32 2
  store i8 26, ptr %gep3, align 1
  %cast = bitcast ptr %a to ptr
  %elt = gep inbounds ptr %cast, 8 x i32 0, 1 x i64 0
  %load = load i64, ptr %elt, align 4
  %result = and i64 %load, 16777215
  ret i64 %result
}
=>
define i64 @test9() {
%entry:
  %a.sroa.3.0.insert.ext = zext i8 26 to i64
  %a.sroa.3.0.insert.shift = shl i64 %a.sroa.3.0.insert.ext, 16
  %a.sroa.3.0.insert.mask = and i64 undef, -16711681
  %a.sroa.3.0.insert.insert = or i64 %a.sroa.3.0.insert.mask, %a.sroa.3.0.insert.shift
  %a.sroa.2.0.insert.ext = zext i8 0 to i64
  %a.sroa.2.0.insert.shift = shl i64 %a.sroa.2.0.insert.ext, 8
  %a.sroa.2.0.insert.mask = and i64 %a.sroa.3.0.insert.insert, -65281
  %a.sroa.2.0.insert.insert = or i64 %a.sroa.2.0.insert.mask, %a.sroa.2.0.insert.shift
  %a.sroa.0.0.insert.ext = zext i8 0 to i64
  %a.sroa.0.0.insert.mask = and i64 %a.sroa.2.0.insert.insert, -256
  %a.sroa.0.0.insert.insert = or i64 %a.sroa.0.0.insert.mask, %a.sroa.0.0.insert.ext
  %result = and i64 %a.sroa.0.0.insert.insert, 16777215
  ret i64 %result
}
Transformation seems to be correct!


----------------------------------------
define ptr @test10() {
%entry:
  %a = alloca i64 8, align 1
  %ptr = gep ptr %a, 8 x i32 0, 1 x i32 0
  memset ptr %ptr align 1, i8 0, i32 8
  %s2ptrptr = bitcast ptr %ptr to ptr
  %s2ptr = load ptr, ptr %s2ptrptr, align 8
  ret ptr %s2ptr
}
=>
define ptr @test10() {
%entry:
  ret ptr null
}
Transformation seems to be correct!


----------------------------------------
define i32 @test11(i1 %c1) {
%entry:
  %X = alloca i64 4, align 4
  br i1 %c1, label %good, label %bad

%bad:
  %Y2 = gep ptr %X, 4 x i64 1
  store i32 0, ptr %Y2, align 4
  %Z2 = load i32, ptr %Y2, align 4
  ret i32 %Z2

%good:
  %Y = gep ptr %X, 4 x i64 0
  store i32 0, ptr %Y, align 4
  %Z = load i32, ptr %Y, align 4
  ret i32 %Z
}
=>
define i32 @test11(i1 %c1) {
%entry:
  br i1 %c1, label %good, label %bad

%bad:
  ret i32 poison

%good:
  ret i32 0
}
Transformation seems to be correct!


----------------------------------------
define i8 @test12() {
%entry:
  %a = alloca i64 3, align 1
  %b = alloca i64 3, align 1
  %a0ptr = gep ptr %a, 3 x i64 0, 1 x i32 0
  store i8 0, ptr %a0ptr, align 1
  %a1ptr = gep ptr %a, 3 x i64 0, 1 x i32 1
  store i8 0, ptr %a1ptr, align 1
  %a2ptr = gep ptr %a, 3 x i64 0, 1 x i32 2
  store i8 0, ptr %a2ptr, align 1
  %aiptr = bitcast ptr %a to ptr
  %ai = load i24, ptr %aiptr, align 4
  %biptr = bitcast ptr %b to ptr
  store i24 %ai, ptr %biptr, align 4
  %b0ptr = gep ptr %b, 3 x i64 0, 1 x i32 0
  %b0 = load i8, ptr %b0ptr, align 1
  %b1ptr = gep ptr %b, 3 x i64 0, 1 x i32 1
  %b1 = load i8, ptr %b1ptr, align 1
  %b2ptr = gep ptr %b, 3 x i64 0, 1 x i32 2
  %b2 = load i8, ptr %b2ptr, align 1
  %bsum0 = add i8 %b0, %b1
  %bsum1 = add i8 %bsum0, %b2
  ret i8 %bsum1
}
=>
define i8 @test12() {
%entry:
  %a.sroa.3.0.insert.ext = zext i8 0 to i24
  %a.sroa.3.0.insert.shift = shl i24 %a.sroa.3.0.insert.ext, 16
  %a.sroa.3.0.insert.mask = and i24 undef, 65535
  %a.sroa.3.0.insert.insert = or i24 %a.sroa.3.0.insert.mask, %a.sroa.3.0.insert.shift
  %a.sroa.2.0.insert.ext = zext i8 0 to i24
  %a.sroa.2.0.insert.shift = shl i24 %a.sroa.2.0.insert.ext, 8
  %a.sroa.2.0.insert.mask = and i24 %a.sroa.3.0.insert.insert, 16711935
  %a.sroa.2.0.insert.insert = or i24 %a.sroa.2.0.insert.mask, %a.sroa.2.0.insert.shift
  %a.sroa.0.0.insert.ext = zext i8 0 to i24
  %a.sroa.0.0.insert.mask = and i24 %a.sroa.2.0.insert.insert, 16776960
  %a.sroa.0.0.insert.insert = or i24 %a.sroa.0.0.insert.mask, %a.sroa.0.0.insert.ext
  %b.sroa.0.0.extract.trunc = trunc i24 %a.sroa.0.0.insert.insert to i8
  %b.sroa.2.0.extract.shift = lshr i24 %a.sroa.0.0.insert.insert, 8
  %b.sroa.2.0.extract.trunc = trunc i24 %b.sroa.2.0.extract.shift to i8
  %b.sroa.3.0.extract.shift = lshr i24 %a.sroa.0.0.insert.insert, 16
  %b.sroa.3.0.extract.trunc = trunc i24 %b.sroa.3.0.extract.shift to i8
  %bsum0 = add i8 %b.sroa.0.0.extract.trunc, %b.sroa.2.0.extract.trunc
  %bsum1 = add i8 %bsum0, %b.sroa.3.0.extract.trunc
  ret i8 %bsum1
}
Transformation seems to be correct!


----------------------------------------
define i32 @test13() {
%entry:
  %a = alloca i64 3, align 2
  %b0ptr = gep ptr %a, 3 x i64 0, 1 x i32 0
  store i8 0, ptr %b0ptr, align 1
  %b1ptr = gep ptr %a, 3 x i64 0, 1 x i32 1
  store i8 0, ptr %b1ptr, align 1
  %b2ptr = gep ptr %a, 3 x i64 0, 1 x i32 2
  store i8 0, ptr %b2ptr, align 1
  %iptrcast = bitcast ptr %a to ptr
  %iptrgep = gep ptr %iptrcast, 2 x i64 1
  %i = load i16, ptr %iptrgep, align 2
  %ret = zext i16 %i to i32
  ret i32 %ret
}
=>
define i32 @test13() {
%entry:
  %a.sroa.2.2.load.ext = zext i8 0 to i16
  %ret = zext i16 %a.sroa.2.2.load.ext to i32
  ret i32 %ret
}
Transformation seems to be correct!


----------------------------------------
define void @test14(...) {
%entry:
  %a = alloca i64 12, align 8
  %p = alloca i64 8, align 8
  %0 = bitcast ptr %a to ptr
  %1 = gep ptr %0, 1 x i64 12
  %2 = bitcast ptr %1 to ptr
  %3 = gep inbounds ptr %2, 12 x i32 0, 1 x i64 0
  %4 = gep inbounds ptr %a, 12 x i32 0, 1 x i64 0
  %5 = bitcast ptr %3 to ptr
  %6 = bitcast ptr %4 to ptr
  %7 = load i32, ptr %6, align 4
  store i32 %7, ptr %5, align 4
  %8 = gep inbounds ptr %5, 4 x i32 1
  %9 = gep inbounds ptr %6, 4 x i32 1
  %10 = load i32, ptr %9, align 4
  store i32 %10, ptr %8, align 4
  %11 = gep inbounds ptr %5, 4 x i32 2
  %12 = gep inbounds ptr %6, 4 x i32 2
  %13 = load i32, ptr %12, align 4
  store i32 %13, ptr %11, align 4
  ret void
}
=>
define void @test14(...) {
%entry:
  ret void
}
Transformation seems to be correct!


----------------------------------------
define i32 @test15(i1 %flag) {
%entry:
  %l0 = alloca i64 8, align 8
  %l1 = alloca i64 8, align 8
  %l2 = alloca i64 8, align 8
  %l3 = alloca i64 8, align 8
  br label %loop

%loop:
  %dead3 = phi ptr [ %gep3, %loop ], [ null, %entry ]
  store i64 1879048192, ptr %l0, align 8
  store i64 1879048192, ptr %l1, align 8
  store i64 1879048192, ptr %l2, align 8
  %bc2 = bitcast ptr %l2 to ptr
  %gep2.1 = gep ptr %bc2, 1 x i64 1
  %gep2.2 = gep ptr %bc2, 1 x i64 3
  %dead2 = select i1 %flag, ptr %gep2.1, ptr %gep2.2
  store i64 1879048192, ptr %l3, align 8
  %bc3 = bitcast ptr %l3 to ptr
  %gep3 = gep ptr %bc3, 1 x i64 3
  br label %loop
}
=>
define i32 @test15(i1 %flag) {
%entry:
  br label %loop

%loop:
  br label %loop
}
Transformation seems to be correct!

ERROR: Unsupported metadata: 1
ERROR: Unsupported metadata: 1
ERROR: Unsupported metadata: 1

----------------------------------------
define i64 @test19(ptr %x) {
%entry:
  %a = alloca i64 16, align 8
  %cast1 = bitcast ptr %x to ptr
  %cast2 = bitcast ptr %a to ptr
  memcpy ptr %cast2 align 1, ptr %cast1 align 1, i32 16
  %gep = gep inbounds ptr %a, 16 x i32 0, 1 x i64 0
  %val = load i64, ptr %gep, align 4
  ret i64 %val
}
=>
define i64 @test19(ptr %x) {
%entry:
  %cast1 = bitcast ptr %x to ptr
  %a.sroa.0.0.cast1.sroa_cast = bitcast ptr %cast1 to ptr
  %a.sroa.0.0.copyload = load i64, ptr %a.sroa.0.0.cast1.sroa_cast, align 1
  %a.sroa.2.0.cast1.sroa_idx = gep inbounds ptr %cast1, 1 x i64 8
  %a.sroa.2.0.cast1.sroa_cast = bitcast ptr %a.sroa.2.0.cast1.sroa_idx to ptr
  %a.sroa.2.0.copyload = load ptr, ptr %a.sroa.2.0.cast1.sroa_cast, align 1
  ret i64 %a.sroa.0.0.copyload
}
Transformation seems to be correct!

ERROR: Unsupported instruction:   %cast1 = addrspacecast %opaque* %x to i8 addrspace(1)*

----------------------------------------
define i32 @test20() {
%entry:
  %a = alloca i64 12, align 4
  %gep1 = gep ptr %a, 12 x i32 0, 4 x i32 0
  store i32 1, ptr %gep1, align 4
  %gep2.1 = gep ptr %a, 12 x i32 0, 4 x i32 4294967294
  %gep2.2 = gep ptr %gep2.1, 4 x i32 3
  store i32 2, ptr %gep2.2, align 4
  %gep3.1 = gep ptr %a, 12 x i32 0, 4 x i32 14
  %gep3.2 = gep ptr %gep3.1, 4 x i32 4294967284
  store i32 3, ptr %gep3.2, align 4
  %load1 = load i32, ptr %gep1, align 4
  %load2 = load i32, ptr %gep2.2, align 4
  %load3 = load i32, ptr %gep3.2, align 4
  %sum1 = add i32 %load1, %load2
  %sum2 = add i32 %sum1, %load3
  ret i32 %sum2
}
=>
define i32 @test20() {
%entry:
  %sum1 = add i32 1, 2
  %sum2 = add i32 %sum1, 3
  ret i32 %sum2
}
Transformation seems to be correct!


----------------------------------------
define i8 @test21() {
%entry:
  %a = alloca i64 2305843009213693951, align 1
  %gep0 = gep ptr %a, 2305843009213693951 x i64 0, 1 x i64 2305843009213693949
  store i8 255, ptr %gep0, align 1
  %gep1 = gep ptr %a, 2305843009213693951 x i64 0, 1 x i64 -9223372036854775807
  %gep2 = gep ptr %gep1, 1 x i64 -1
  memset ptr %gep2 align 1, i8 0, i64 -1
  %gep3 = gep ptr %gep1, 1 x i64 9223372036854775807
  %gep4 = gep ptr %gep3, 1 x i64 9223372036854775807
  %gep5 = gep ptr %gep4, 1 x i64 -6917529027641081857
  store i8 255, ptr %gep5, align 1
  %cast1 = bitcast ptr %gep4 to ptr
  store i32 0, ptr %cast1, align 4
  %load = load i8, ptr %gep0, align 1
  %gep6 = gep ptr %gep0, 1 x i32 1
  %load2 = load i8, ptr %gep6, align 1
  %result = or i8 %load, %load2
  ret i8 %result
}
=>
define i8 @test21() {
%entry:
  %result = or i8 255, 255
  ret i8 %result
}
Transformation seems to be correct!


----------------------------------------
define void @PR13916.1() {
%entry:
  %a = alloca i64 1, align 1
  memcpy ptr %a align 1, ptr %a align 1, i32 1
  %tmp2 = load i8, ptr %a, align 1
  ret void
}
=>
define void @PR13916.1() {
%entry:
  ret void
}
Transformation seems to be correct!


----------------------------------------
define void @PR13916.2(i1 %c1) {
%entry:
  %a = alloca i64 1, align 1
  br i1 %c1, label %if.then, label %if.end

%if.then:
  %tmp0 = bitcast ptr %a to ptr
  %tmp1 = bitcast ptr %a to ptr
  memcpy ptr %tmp0 align 1, ptr %tmp1 align 1, i32 1
  br label %if.end

%if.end:
  %gep = gep ptr %a, 1 x i32 0, 1 x i64 0
  %tmp2 = load i8, ptr %gep, align 1
  ret void
}
=>
define void @PR13916.2(i1 %c1) {
%entry:
  br i1 %c1, label %if.then, label %if.end

%if.then:
  br label %if.end

%if.end:
  ret void
}
Transformation seems to be correct!


----------------------------------------
define void @PR13990(i1 %c1, i1 %c2, i1 %c3, i1 %c4, ptr %ptr) {
%entry:
  %tmp1 = alloca i64 8, align 8
  %tmp2 = alloca i64 8, align 8
  br i1 %c1, label %bb1, label %bb2

%bb1:
  store ptr %ptr, ptr %tmp2, align 8
  br i1 %c2, label %bb2, label %bb3

%bb2:
  %tmp50 = select i1 %c3, ptr %tmp2, ptr %tmp1
  br i1 %c4, label %bb3, label %bb4

%bb4:
  assume i1 0

%bb3:
  assume i1 0
}
=>
define void @PR13990(i1 %c1, i1 %c2, i1 %c3, i1 %c4, ptr %ptr) {
%entry:
  br i1 %c1, label %bb1, label %bb2

%bb1:
  br i1 %c2, label %bb2, label %bb3

%bb2:
  br i1 %c4, label %bb3, label %bb4

%bb4:
  assume i1 0

%bb3:
  assume i1 0
}
Transformation seems to be correct!


----------------------------------------
define double @PR13969(double %x) {
%entry:
  %a = alloca i64 8, align 8
  %b = alloca i64 8, align 8
  %c = alloca i64 8, align 8
  store double %x, ptr %a, align 8
  store ptr %c, ptr %b, align 8
  store ptr %a, ptr %b, align 8
  store double %x, ptr %c, align 8
  %ret = load double, ptr %a, align 8
  ret double %ret
}
=>
define double @PR13969(double %x) {
%entry:
  ret double %x
}
Transformation seems to be correct!


----------------------------------------
define void @PR14034(ptr %ptr, ptr %ptr2) {
%entry:
  %a = alloca i64 24, align 8
  %list = gep ptr %a, 24 x i32 0, 1 x i64 8
  %prev = gep ptr %list, 16 x i32 0, 1 x i64 8
  store ptr %ptr, ptr %prev, align 8
  %cast0 = bitcast ptr %ptr2 to ptr
  %cast1 = bitcast ptr %a to ptr
  memcpy ptr %cast0 align 1, ptr %cast1 align 1, i32 12
  ret void
}
=>
define void @PR14034(ptr %ptr, ptr %ptr2) {
%entry:
  %a.sroa.0 = alloca i64 12, align 8
  %a.sroa.0.0.cast0.sroa_cast = bitcast ptr %ptr2 to ptr
  %a.sroa.0.0.cast1.sroa_idx = gep inbounds ptr %a.sroa.0, 12 x i64 0, 1 x i64 0
  memcpy ptr %a.sroa.0.0.cast0.sroa_cast align 1, ptr %a.sroa.0.0.cast1.sroa_idx align 8, i32 12
  ret void
}
Transformation seems to be correct!


----------------------------------------
define i32 @test22(i32 %x) {
%entry:
  %a1 = alloca i64 4, align 8
  %a2 = alloca i64 4, align 8
  %a3 = alloca i64 8, align 8
  %wrap1 = insertvalue [1 x {i32}] poison, i32 %x, 0, 0
  %gep1 = gep ptr %a1, 4 x i32 0, 1 x i64 0, 1 x i64 0
  store [1 x {i32}] %wrap1, ptr %gep1, align 4
  %gep2 = gep ptr %a1, 4 x i32 0, 1 x i64 0
  %ptrcast1 = bitcast ptr %gep2 to ptr
  %load1 = load {[1 x {float}]}, ptr %ptrcast1, align 4
  %unwrap1 = extractvalue {[1 x {float}]} %load1, 0, 0
  %wrap2 = insertvalue {{}, {float}, (empty array)} poison, {float} %unwrap1, 1
  store {{}, {float}, (empty array)} %wrap2, ptr %a2, align 4
  %gep3 = gep ptr %a2, 4 x i32 0, 1 x i64 0, 1 x i64 0
  %ptrcast2 = bitcast ptr %gep3 to ptr
  %load3 = load <4 x i8>, ptr %ptrcast2, align 4
  %valcast1 = bitcast <4 x i8> %load3 to i32
  %wrap3 = insertvalue [1 x [1 x i32]] poison, i32 %valcast1, 0, 0
  %wrap4 = insertvalue {[1 x [1 x i32]], {}} poison, [1 x [1 x i32]] %wrap3, 0
  %gep4 = gep ptr %a3, 8 x i32 0, 1 x i64 0
  %ptrcast3 = bitcast ptr %gep4 to ptr
  store {[1 x [1 x i32]], {}} %wrap4, ptr %ptrcast3, align 4
  %gep5 = gep ptr %a3, 8 x i32 0, 1 x i64 0, 1 x i64 0, 4 x i32 0
  %ptrcast4 = bitcast ptr %gep5 to ptr
  %load4 = load {{}, float, {}}, ptr %ptrcast4, align 4
  %unwrap2 = extractvalue {{}, float, {}} %load4, 1
  %valcast2 = bitcast float %unwrap2 to i32
  ret i32 %valcast2
}
=>
define i32 @test22(i32 %x) {
%entry:
  %wrap1 = insertvalue [1 x {i32}] poison, i32 %x, 0, 0
  %wrap1.fca.0.0.extract = extractvalue [1 x {i32}] %wrap1, 0, 0
  %0 = bitcast i32 %wrap1.fca.0.0.extract to float
  %load1.fca.0.0.0.insert = insertvalue {[1 x {float}]} poison, float %0, 0, 0, 0
  %unwrap1 = extractvalue {[1 x {float}]} %load1.fca.0.0.0.insert, 0, 0
  %wrap2 = insertvalue {{}, {float}, (empty array)} poison, {float} %unwrap1, 1
  %wrap2.fca.1.0.extract = extractvalue {{}, {float}, (empty array)} %wrap2, 1, 0
  %1 = bitcast float %wrap2.fca.1.0.extract to <4 x i8>
  %valcast1 = bitcast <4 x i8> %1 to i32
  %wrap3 = insertvalue [1 x [1 x i32]] poison, i32 %valcast1, 0, 0
  %wrap4 = insertvalue {[1 x [1 x i32]], {}} poison, [1 x [1 x i32]] %wrap3, 0
  %wrap4.fca.0.0.0.extract = extractvalue {[1 x [1 x i32]], {}} %wrap4, 0, 0, 0
  %2 = bitcast i32 %wrap4.fca.0.0.0.extract to <4 x i8>
  %3 = bitcast <4 x i8> %2 to float
  %load4.fca.1.insert = insertvalue {{}, float, {}} poison, float %3, 1
  %unwrap2 = extractvalue {{}, float, {}} %load4.fca.1.insert, 1
  %valcast2 = bitcast float %unwrap2 to i32
  ret i32 %valcast2
}
Transformation seems to be correct!


----------------------------------------
define void @PR14059.1(ptr %d) {
%entry:
  %X.sroa.0.i = alloca i64 8, align 8, dead
  %0 = bitcast ptr %X.sroa.0.i to ptr
  start_lifetime ptr %0
  %X.sroa.0.0.cast2.i = bitcast ptr %X.sroa.0.i to ptr
  store i32 0, ptr %X.sroa.0.0.cast2.i, align 8
  %X.sroa.0.2.raw_idx2.i = gep inbounds ptr %0, 1 x i32 2
  memset ptr %X.sroa.0.2.raw_idx2.i align 1, i8 0, i64 4
  memset ptr %0 align 1, i8 0, i64 8
  %X.sroa.0.4.raw_idx4.i = gep inbounds ptr %0, 1 x i32 4
  %d.raw = bitcast ptr %d to ptr
  memcpy ptr %X.sroa.0.4.raw_idx4.i align 1, ptr %d.raw align 1, i32 4
  %X.sroa.0.4.cast5.i = bitcast ptr %X.sroa.0.4.raw_idx4.i to ptr
  store i32 1072693248, ptr %X.sroa.0.4.cast5.i, align 4
  %X.sroa.0.0.load1.i = load double, ptr %X.sroa.0.i, align 8
  %accum.real.i = load double, ptr %d, align 8
  %add.r.i = fadd double %accum.real.i, %X.sroa.0.0.load1.i, exceptions=ignore
  store double %add.r.i, ptr %d, align 8
  free ptr %0 unconstrained
  ret void
}
=>
define void @PR14059.1(ptr %d) {
%entry:
  %0 = bitcast double undef to i64
  %X.sroa.0.i.0.insert.mask = and i64 %0, -4294967296
  %X.sroa.0.i.0.insert.insert = or i64 %X.sroa.0.i.0.insert.mask, 0
  %1 = bitcast i64 %X.sroa.0.i.0.insert.insert to double
  %2 = bitcast double %1 to i64
  %X.sroa.0.i.2.insert.mask = and i64 %2, -281474976645121
  %X.sroa.0.i.2.insert.insert = or i64 %X.sroa.0.i.2.insert.mask, 0
  %X.sroa.0.i.4.d.raw.sroa_cast = bitcast ptr %d to ptr
  %X.sroa.0.i.4.copyload = load i32, ptr %X.sroa.0.i.4.d.raw.sroa_cast, align 1
  %5 = bitcast double 0.000000 to i64
  %X.sroa.0.i.4.insert.ext = zext i32 %X.sroa.0.i.4.copyload to i64
  %X.sroa.0.i.4.insert.shift = shl i64 %X.sroa.0.i.4.insert.ext, 32
  %X.sroa.0.i.4.insert.mask4 = and i64 %5, 4294967295
  %X.sroa.0.i.4.insert.insert5 = or i64 %X.sroa.0.i.4.insert.mask4, %X.sroa.0.i.4.insert.shift
  %6 = bitcast i64 %X.sroa.0.i.4.insert.insert5 to double
  %7 = bitcast double %6 to i64
  %X.sroa.0.i.4.insert.mask = and i64 %7, 4294967295
  %X.sroa.0.i.4.insert.insert = or i64 %X.sroa.0.i.4.insert.mask, 4607182418800017408
  %8 = bitcast i64 %X.sroa.0.i.4.insert.insert to double
  %accum.real.i = load double, ptr %d, align 8
  %add.r.i = fadd double %accum.real.i, %8, exceptions=ignore
  store double %add.r.i, ptr %d, align 8
  ret void
}
Transformation doesn't verify!
ERROR: Mismatch in memory

Example:
ptr %d = pointer(non-local, block_id=1, offset=0)

Source:
ptr %X.sroa.0.i = pointer(local, block_id=2, offset=0)
ptr %0 = pointer(local, block_id=2, offset=0)
ptr %X.sroa.0.0.cast2.i = pointer(local, block_id=2, offset=0)
ptr %X.sroa.0.2.raw_idx2.i = pointer(local, block_id=2, offset=2)
ptr %X.sroa.0.4.raw_idx4.i = pointer(local, block_id=2, offset=4)
ptr %d.raw = pointer(non-local, block_id=1, offset=0)
ptr %X.sroa.0.4.cast5.i = pointer(local, block_id=2, offset=4)
double %X.sroa.0.0.load1.i = #x3ff0000000000000 (1)
double %accum.real.i = #x3ff02087fff00003 (1.007942199474?)
double %add.r.i = #x40001043fff80002 (2.007942199474?)

SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 >	size: 0	align: 1	alloc type: 0
Block 1 >	size: 32	align: 256	alloc type: 0

LOCAL BLOCKS:
Block 2 >	size: 8	align: 8	alloc type: 1

Target:
i64 %0 = #x7fffffffffffffff (9223372036854775807)	[based on undef value]
i64 %X.sroa.0.i.0.insert.mask = #x7fffffff00000000 (9223372032559808512)
i64 %X.sroa.0.i.0.insert.insert = #x7fffffff00000000 (9223372032559808512)
double %1 = NaN
i64 %2 = #x7fffffffffffffff (9223372036854775807)
i64 %X.sroa.0.i.2.insert.mask = #x7fff00000000ffff (9223090561878130687)
i64 %X.sroa.0.i.2.insert.insert = #x7fff00000000ffff (9223090561878130687)
ptr %X.sroa.0.i.4.d.raw.sroa_cast = pointer(non-local, block_id=1, offset=0)
i32 %X.sroa.0.i.4.copyload = #xfff00003 (4293918723, -1048573)
i64 %5 = #x0000000000000000 (0)
i64 %X.sroa.0.i.4.insert.ext = #x00000000fff00003 (4293918723)
i64 %X.sroa.0.i.4.insert.shift = #xfff0000300000000 (18442240486967083008, -4503586742468608)
i64 %X.sroa.0.i.4.insert.mask4 = #x0000000000000000 (0)
i64 %X.sroa.0.i.4.insert.insert5 = #xfff0000300000000 (18442240486967083008, -4503586742468608)
double %6 = NaN
i64 %7 = #x7ff00000000ffffd (9218868437228453885)
i64 %X.sroa.0.i.4.insert.mask = #x00000000000ffffd (1048573)
i64 %X.sroa.0.i.4.insert.insert = #x3ff00000000ffffd (4607182418801065981)
double %8 = #x3ff00000000ffffd (1.000000000232?)
double %accum.real.i = #x3ff02087fff00003 (1.007942199474?)
double %add.r.i = #x4000104400000000 (2.007942199707?)

Mismatch in pointer(non-local, block_id=1, offset=4)
Source value: #x43
Target value: #x44


------------------- SMT STATS -------------------
Num queries: 71
Num invalid: 0
Num skips:   0
Num trivial: 148 (67.6%)
Num timeout: 0 (0.0%)
Num errors:  0 (0.0%)
Num SAT:     62 (87.3%)
Num UNSAT:   9 (12.7%)
Alive2: Transform doesn't verify; aborting!

stderr:

+ : 'RUN: at line 2'
+ /home/nlopes/alive2/build/opt-alive.sh -passes=sroa -S
+ /tmp/nlopes/llvm/build/bin/FileCheck /tmp/nlopes/llvm/llvm/test/Transforms/SROA/basictest.ll

FileCheck error: '<stdin>' is empty.
FileCheck command line:  /tmp/nlopes/llvm/build/bin/FileCheck /tmp/nlopes/llvm/llvm/test/Transforms/SROA/basictest.ll

 

<-- Back