mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Use element initialization for <= 16 bytes structs and arrays.
This commit is contained in:
@@ -82,6 +82,35 @@ void llvm_emit_memclear(GenContext *c, BEValue *ref)
|
||||
llvm_emit_memclear(c, &element);
|
||||
return;
|
||||
}
|
||||
if (type_size(type) <= 16)
|
||||
{
|
||||
if (type->type_kind == TYPE_STRUCT)
|
||||
{
|
||||
Decl *decl = type->decl;
|
||||
Decl **members = decl->strukt.members;
|
||||
VECEACH(members, i)
|
||||
{
|
||||
if (!type_size(members[i]->type)) continue;
|
||||
BEValue member_ref;
|
||||
llvm_emit_struct_member_ref(c, ref, &member_ref, i);
|
||||
llvm_emit_memclear(c, &member_ref);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (type->type_kind == TYPE_ARRAY)
|
||||
{
|
||||
LLVMTypeRef array_type = llvm_get_type(c, type);
|
||||
for (unsigned i = 0; i < type->array.len; i++)
|
||||
{
|
||||
AlignSize align;
|
||||
LLVMValueRef element_ptr = llvm_emit_array_gep_raw(c, ref->value, array_type, i, ref->alignment, &align);
|
||||
BEValue be_value;
|
||||
llvm_value_set_address_align(&be_value, element_ptr, type->array.base, align);
|
||||
llvm_emit_memclear(c, &be_value);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
llvm_emit_memclear_size_align(c, ref->value, type_size(ref->type), ref->alignment, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -428,7 +428,6 @@ static void x64_classify(Type *type, ByteSize offset_base, X64Class *lo_class, X
|
||||
*current = CLASS_INTEGER;
|
||||
break;
|
||||
case TYPE_F16:
|
||||
TODO
|
||||
case TYPE_F32:
|
||||
case TYPE_F64:
|
||||
*current = CLASS_SSE;
|
||||
|
||||
@@ -41,13 +41,16 @@ entry:
|
||||
define void @main() #0 {
|
||||
entry:
|
||||
%literal = alloca %Foo, align 4
|
||||
%0 = bitcast %Foo* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 8, i1 false)
|
||||
%1 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0
|
||||
%2 = getelementptr inbounds [2 x float], [2 x float]* %1, i64 0, i64 0
|
||||
%loadexpanded = load float, float* %2, align 4
|
||||
%3 = getelementptr inbounds [2 x float], [2 x float]* %1, i64 0, i64 1
|
||||
%loadexpanded1 = load float, float* %3, align 4
|
||||
%0 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0
|
||||
%1 = getelementptr inbounds [2 x float], [2 x float]* %0, i64 0, i64 0
|
||||
store float 0.000000e+00, float* %1, align 4
|
||||
%2 = getelementptr inbounds [2 x float], [2 x float]* %0, i64 0, i64 1
|
||||
store float 0.000000e+00, float* %2, align 4
|
||||
%3 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0
|
||||
%4 = getelementptr inbounds [2 x float], [2 x float]* %3, i64 0, i64 0
|
||||
%loadexpanded = load float, float* %4, align 4
|
||||
%5 = getelementptr inbounds [2 x float], [2 x float]* %3, i64 0, i64 1
|
||||
%loadexpanded1 = load float, float* %5, align 4
|
||||
call x86_regcallcc void @test.test(float %loadexpanded, float %loadexpanded1)
|
||||
ret void
|
||||
}
|
||||
|
||||
@@ -18,19 +18,24 @@ extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2
|
||||
define %Vector2 @vector2_zero()
|
||||
entry:
|
||||
%literal = alloca %Vector2, align 4
|
||||
%0 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 8, i1 false)
|
||||
%1 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %1
|
||||
%0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %0, align 4
|
||||
%1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %1, align 4
|
||||
%2 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %2
|
||||
}
|
||||
|
||||
define %Vector2 @vector2_one()
|
||||
entry:
|
||||
%literal = alloca %Vector2, align 4
|
||||
%0 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 8, i1 false)
|
||||
%1 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %1
|
||||
%0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %0, align 4
|
||||
%1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %1, align 4
|
||||
%2 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %2
|
||||
}
|
||||
|
||||
|
||||
define %Vector2 @vector2_add(float %0, float %1, float %2, float %3)
|
||||
@@ -48,10 +53,12 @@ entry:
|
||||
store float %2, float* %6, align 4
|
||||
%7 = getelementptr inbounds { float, float }, { float, float }* %coerce1, i32 0, i32 1
|
||||
store float %3, float* %7, align 4
|
||||
%8 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %8, i8 0, i64 8, i1 false)
|
||||
%9 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %9
|
||||
%8 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %8, align 4
|
||||
%9 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %9, align 4
|
||||
%10 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %10
|
||||
}
|
||||
|
||||
define %Vector2 @vector2_add_value(float %0, float %1, float %2)
|
||||
@@ -65,10 +72,12 @@ entry:
|
||||
%4 = getelementptr inbounds { float, float }, { float, float }* %coerce, i32 0, i32 1
|
||||
store float %1, float* %4, align 4
|
||||
store float %2, float* %add, align 4
|
||||
%5 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %5, i8 0, i64 8, i1 false)
|
||||
%6 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %6
|
||||
%5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %5, align 4
|
||||
%6 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %6, align 4
|
||||
%7 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %7
|
||||
}
|
||||
|
||||
define %Vector2 @vector2_subtract(float %0, float %1, float %2, float %3)
|
||||
@@ -86,10 +95,13 @@ entry:
|
||||
store float %2, float* %6, align 4
|
||||
%7 = getelementptr inbounds { float, float }, { float, float }* %coerce1, i32 0, i32 1
|
||||
store float %3, float* %7, align 4
|
||||
%8 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %8, i8 0, i64 8, i1 false)
|
||||
%9 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %9
|
||||
%8 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %8, align 4
|
||||
%9 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %9, align 4
|
||||
%10 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %10
|
||||
}
|
||||
|
||||
define %Vector2 @vector2_subtract_value(float %0, float %1, float %2)
|
||||
entry:
|
||||
@@ -102,8 +114,10 @@ entry:
|
||||
%4 = getelementptr inbounds { float, float }, { float, float }* %coerce, i32 0, i32 1
|
||||
store float %1, float* %4, align 4
|
||||
store float %2, float* %sub, align 4
|
||||
%5 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %5, i8 0, i64 8, i1 false)
|
||||
%6 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %6
|
||||
%5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %5, align 4
|
||||
%6 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %6, align 4
|
||||
%7 = load %Vector2, %Vector2* %literal, align 4
|
||||
ret %Vector2 %7
|
||||
}
|
||||
|
||||
@@ -20,24 +20,30 @@ define <2 x float> @vector2_zero()
|
||||
entry:
|
||||
%literal = alloca %Vector2, align 4
|
||||
%tempcoerce = alloca <2 x float>, align 8
|
||||
%0 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 8, i1 false)
|
||||
%1 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%2 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 4 %2, i32 8, i1 false)
|
||||
%3 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %3
|
||||
%0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %0, align 4
|
||||
%1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %1, align 4
|
||||
%2 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%3 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %2, i8* align 4 %3, i32 8, i1 false)
|
||||
%4 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %4
|
||||
}
|
||||
|
||||
define <2 x float> @vector2_one()
|
||||
%literal = alloca %Vector2, align 4
|
||||
%tempcoerce = alloca <2 x float>, align 8
|
||||
%0 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 8, i1 false)
|
||||
%1 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%2 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 4 %2, i32 8, i1 false)
|
||||
%3 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %3
|
||||
%0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %0, align 4
|
||||
%1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %1, align 4
|
||||
%2 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%3 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %2, i8* align 4 %3, i32 8, i1 false)
|
||||
%4 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %4
|
||||
}
|
||||
|
||||
define <2 x float> @vector2_add(<2 x float> %0, <2 x float> %1)
|
||||
entry:
|
||||
@@ -49,13 +55,15 @@ entry:
|
||||
store <2 x float> %0, <2 x float>* %2, align 4
|
||||
%3 = bitcast %Vector2* %v2 to <2 x float>*
|
||||
store <2 x float> %1, <2 x float>* %3, align 4
|
||||
%4 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %4, i8 0, i64 8, i1 false)
|
||||
%5 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%6 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %5, i8* align 4 %6, i32 8, i1 false)
|
||||
%7 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %7
|
||||
%4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %4, align 4
|
||||
%5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %5, align 4
|
||||
%6 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%7 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %6, i8* align 4 %7, i32 8, i1 false)
|
||||
%8 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %8
|
||||
}
|
||||
|
||||
define <2 x float> @vector2_add_value(<2 x float> %0, float %1) #0 {
|
||||
@@ -66,13 +74,16 @@ define <2 x float> @vector2_add_value(<2 x float> %0, float %1) #0 {
|
||||
%2 = bitcast %Vector2* %v to <2 x float>*
|
||||
store <2 x float> %0, <2 x float>* %2, align 4
|
||||
store float %1, float* %add, align 4
|
||||
%3 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %3, i8 0, i64 8, i1 false)
|
||||
%4 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%5 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %4, i8* align 4 %5, i32 8, i1 false)
|
||||
%6 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %6
|
||||
%3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %3, align 4
|
||||
%4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %4, align 4
|
||||
%5 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%6 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %5, i8* align 4 %6, i32 8, i1 false)
|
||||
%7 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %7
|
||||
}
|
||||
|
||||
define <2 x float> @vector2_subtract(<2 x float> %0, <2 x float> %1)
|
||||
entry:
|
||||
@@ -84,13 +95,16 @@ entry:
|
||||
store <2 x float> %0, <2 x float>* %2, align 4
|
||||
%3 = bitcast %Vector2* %v2 to <2 x float>*
|
||||
store <2 x float> %1, <2 x float>* %3, align 4
|
||||
%4 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %4, i8 0, i64 8, i1 false)
|
||||
%5 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%6 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %5, i8* align 4 %6, i32 8, i1 false)
|
||||
%7 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %7
|
||||
%4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %4, align 4
|
||||
%5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %5, align 4
|
||||
%6 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%7 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %6, i8* align 4 %7, i32 8, i1 false)
|
||||
%8 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %8
|
||||
}
|
||||
|
||||
define <2 x float> @vector2_subtract_value(<2 x float> %0, float %1)
|
||||
entry:
|
||||
@@ -101,10 +115,13 @@ entry:
|
||||
%2 = bitcast %Vector2* %v to <2 x float>*
|
||||
store <2 x float> %0, <2 x float>* %2, align 4
|
||||
store float %1, float* %sub, align 4
|
||||
%3 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %3, i8 0, i64 8, i1 false)
|
||||
%4 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%5 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %4, i8* align 4 %5, i32 8, i1 false)
|
||||
%6 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %6
|
||||
%3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0
|
||||
store float 0.000000e+00, float* %3, align 4
|
||||
%4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1
|
||||
store float 0.000000e+00, float* %4, align 4
|
||||
%5 = bitcast <2 x float>* %tempcoerce to i8*
|
||||
%6 = bitcast %Vector2* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %5, i8* align 4 %6, i32 8, i1 false)
|
||||
%7 = load <2 x float>, <2 x float>* %tempcoerce, align 8
|
||||
ret <2 x float> %7
|
||||
}
|
||||
|
||||
@@ -12,14 +12,22 @@ fn void test()
|
||||
|
||||
%"int[]" = type { i32*, i64 }
|
||||
|
||||
%x = alloca [3 x i32], align 4
|
||||
%y = alloca i32*, align 8
|
||||
%z = alloca %"int[]", align 8
|
||||
%0 = bitcast [3 x i32]* %x to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 12, i1 false)
|
||||
%ptrptr = bitcast [3 x i32]* %x to i32*
|
||||
store i32* %ptrptr, i32** %y, align 8
|
||||
%1 = bitcast [3 x i32]* %x to i32*
|
||||
%2 = insertvalue %"int[]" undef, i32* %1, 0
|
||||
%3 = insertvalue %"int[]" %2, i64 3, 1
|
||||
store %"int[]" %3, %"int[]"* %z, align 8
|
||||
define void @array_casts.test() #0 {
|
||||
entry:
|
||||
%x = alloca [3 x i32], align 4
|
||||
%y = alloca i32*, align 8
|
||||
%z = alloca %"int[]", align 8
|
||||
%0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0
|
||||
store i32 0, i32* %0, align 4
|
||||
%1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1
|
||||
store i32 0, i32* %1, align 4
|
||||
%2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2
|
||||
store i32 0, i32* %2, align 4
|
||||
%ptrptr = bitcast [3 x i32]* %x to i32*
|
||||
store i32* %ptrptr, i32** %y, align 8
|
||||
%3 = bitcast [3 x i32]* %x to i32*
|
||||
%4 = insertvalue %"int[]" undef, i32* %3, 0
|
||||
%5 = insertvalue %"int[]" %4, i64 3, 1
|
||||
store %"int[]" %5, %"int[]"* %z, align 8
|
||||
ret void
|
||||
}
|
||||
@@ -39,19 +39,23 @@ entry:
|
||||
%7 = call double @llvm.fma.f64(double %4, double %5, double %6)
|
||||
store double %7, double* %f, align 8
|
||||
store i32 13, i32* %xeb, align 4
|
||||
%8 = bitcast [3 x i32]* %abcd to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %8, i8 0, i64 12, i1 false)
|
||||
%9 = load volatile i32, i32* %xeb, align 4
|
||||
store i32 %9, i32* %sy, align 4
|
||||
%10 = load i32, i32* %sy, align 4
|
||||
%add = add i32 %10, 1
|
||||
store volatile i32 %add, i32* %xeb, align 4
|
||||
%11 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2
|
||||
%8 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 0
|
||||
store i32 0, i32* %8, align 4
|
||||
%9 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 1
|
||||
store i32 0, i32* %9, align 4
|
||||
%10 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2
|
||||
store i32 0, i32* %10, align 4
|
||||
%11 = load volatile i32, i32* %xeb, align 4
|
||||
store i32 %11, i32* %sy, align 4
|
||||
%12 = load i32, i32* %sy, align 4
|
||||
%add1 = add i32 %12, 2
|
||||
store volatile i32 %add1, i32* %11, align 4
|
||||
%add = add i32 %12, 1
|
||||
store volatile i32 %add, i32* %xeb, align 4
|
||||
%13 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2
|
||||
%14 = load volatile i32, i32* %13, align 4
|
||||
store i32 %14, i32* %sy, align 4
|
||||
%14 = load i32, i32* %sy, align 4
|
||||
%add1 = add i32 %14, 2
|
||||
store volatile i32 %add1, i32* %13, align 4
|
||||
%15 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2
|
||||
%16 = load volatile i32, i32* %15, align 4
|
||||
store i32 %16, i32* %sy, align 4
|
||||
ret i32 1
|
||||
}
|
||||
@@ -35,7 +35,7 @@ fn void testSimple()
|
||||
}
|
||||
|
||||
// TODO these may be wrong.
|
||||
// #expect: pointer_access.ll
|
||||
/* #expect: pointer_access.ll
|
||||
|
||||
%ExtraSimple = type { i32, i32, %c, %anon, %anon.0, i32 }
|
||||
%c = type { double, double, double, double, double }
|
||||
@@ -44,6 +44,7 @@ fn void testSimple()
|
||||
|
||||
@ExtraSimple = linkonce_odr constant i8 1
|
||||
|
||||
define void @pointer_access.testSimple() #0 {
|
||||
entry:
|
||||
%a = alloca %ExtraSimple, align 8
|
||||
%0 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 0
|
||||
@@ -62,37 +63,40 @@ entry:
|
||||
%7 = getelementptr inbounds %c, %c* %2, i32 0, i32 4
|
||||
store double 3.300000e+00, double* %7, align 8
|
||||
%8 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3
|
||||
%9 = bitcast %anon* %8 to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 8 %9, i8 0, i64 8, i1 false)
|
||||
%10 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 4
|
||||
%11 = bitcast %anon.0* %10 to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 8 %11, i8 0, i64 8, i1 false)
|
||||
%12 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 5
|
||||
store i32 0, i32* %12, align 8
|
||||
%13 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2
|
||||
%14 = getelementptr inbounds %c, %c* %13, i32 0, i32 4
|
||||
store double 3.400000e+00, double* %14, align 8
|
||||
%15 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 0
|
||||
%16 = load i32, i32* %15, align 8
|
||||
%17 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2
|
||||
%18 = getelementptr inbounds %c, %c* %17, i32 0, i32 0
|
||||
%19 = load double, double* %18, align 8
|
||||
%20 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2
|
||||
%21 = getelementptr inbounds %c, %c* %20, i32 0, i32 3
|
||||
%22 = load double, double* %21, align 8
|
||||
%23 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2
|
||||
%24 = getelementptr inbounds %c, %c* %23, i32 0, i32 4
|
||||
%25 = load double, double* %24, align 8
|
||||
%26 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 5
|
||||
%27 = load i32, i32* %26, align 8
|
||||
%28 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 4
|
||||
%29 = bitcast %anon.0* %28 to double*
|
||||
%30 = load double, double* %29, align 8
|
||||
%31 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3
|
||||
%32 = getelementptr inbounds %anon, %anon* %31, i32 0, i32 0
|
||||
%33 = load i32, i32* %32, align 8
|
||||
%34 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3
|
||||
%35 = getelementptr inbounds %anon, %anon* %34, i32 0, i32 1
|
||||
%36 = load i32, i32* %35, align 4
|
||||
call void (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str, i32 0, i32 0), i32 %16, double %19, double %22, double %25, i32 %27, double %30, i32 %33, i32 %36)
|
||||
%9 = getelementptr inbounds %anon, %anon* %8, i32 0, i32 0
|
||||
store i32 0, i32* %9, align 8
|
||||
%10 = getelementptr inbounds %anon, %anon* %8, i32 0, i32 1
|
||||
store i32 0, i32* %10, align 4
|
||||
%11 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 4
|
||||
%12 = bitcast %anon.0* %11 to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 8 %12, i8 0, i64 8, i1 false)
|
||||
%13 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 5
|
||||
store i32 0, i32* %13, align 8
|
||||
%14 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2
|
||||
%15 = getelementptr inbounds %c, %c* %14, i32 0, i32 4
|
||||
store double 3.400000e+00, double* %15, align 8
|
||||
%16 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 0
|
||||
%17 = load i32, i32* %16, align 8
|
||||
%18 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2
|
||||
%19 = getelementptr inbounds %c, %c* %18, i32 0, i32 0
|
||||
%20 = load double, double* %19, align 8
|
||||
%21 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2
|
||||
%22 = getelementptr inbounds %c, %c* %21, i32 0, i32 3
|
||||
%23 = load double, double* %22, align 8
|
||||
%24 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2
|
||||
%25 = getelementptr inbounds %c, %c* %24, i32 0, i32 4
|
||||
%26 = load double, double* %25, align 8
|
||||
%27 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 5
|
||||
%28 = load i32, i32* %27, align 8
|
||||
%29 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 4
|
||||
%30 = bitcast %anon.0* %29 to double*
|
||||
%31 = load double, double* %30, align 8
|
||||
%32 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3
|
||||
%33 = getelementptr inbounds %anon, %anon* %32, i32 0, i32 0
|
||||
%34 = load i32, i32* %33, align 8
|
||||
%35 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3
|
||||
%36 = getelementptr inbounds %anon, %anon* %35, i32 0, i32 1
|
||||
%37 = load i32, i32* %36, align 4
|
||||
call void (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str, i32 0, i32 0), i32 %17, double %20, double %23, double %26, i32 %28, double %31, i32 %34, i32 %37)
|
||||
ret void
|
||||
}
|
||||
|
||||
@@ -562,98 +562,100 @@ for.exit9: ; preds = %for.cond2
|
||||
%35 = call double @test2.double.getMult(double 3.300000e+00)
|
||||
%36 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.11, i32 0, i32 0), double %35)
|
||||
call void @test.helloWorld()
|
||||
%37 = bitcast %Foo* %ddx to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %37, i8 0, i64 8, i1 false)
|
||||
%37 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 0
|
||||
store i32 0, i32* %37, align 4
|
||||
%38 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 1
|
||||
store i32 0, i32* %38, align 4
|
||||
store i32 3, i32* %fro, align 4
|
||||
%38 = bitcast [4 x i32]* %x to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %38, i8* align 16 bitcast ([4 x i32]* @.__const.12 to i8*), i32 16, i1 false)
|
||||
%39 = load i32, i32* %fro, align 4
|
||||
%40 = getelementptr inbounds %"int[]", %"int[]"* %vararg, i32 0, i32 1
|
||||
%41 = getelementptr inbounds %"int[]", %"int[]"* %vararg, i32 0, i32 0
|
||||
store i64 4, i64* %40, align 8
|
||||
%42 = bitcast [4 x i32]* %x to i32*
|
||||
store i32* %42, i32** %41, align 8
|
||||
%43 = bitcast %"int[]"* %vararg to { i8*, i64 }*
|
||||
%44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 0
|
||||
%lo = load i8*, i8** %44, align 8
|
||||
%45 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 1
|
||||
%hi = load i64, i64* %45, align 8
|
||||
%46 = call i32 @test.sum_us(i8* %lo, i64 %hi)
|
||||
%47 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.13, i32 0, i32 0), i32 %46)
|
||||
%add10 = add i32 %39, %47
|
||||
%39 = bitcast [4 x i32]* %x to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %39, i8* align 16 bitcast ([4 x i32]* @.__const.12 to i8*), i32 16, i1 false)
|
||||
%40 = load i32, i32* %fro, align 4
|
||||
%41 = getelementptr inbounds %"int[]", %"int[]"* %vararg, i32 0, i32 1
|
||||
%42 = getelementptr inbounds %"int[]", %"int[]"* %vararg, i32 0, i32 0
|
||||
store i64 4, i64* %41, align 8
|
||||
%43 = bitcast [4 x i32]* %x to i32*
|
||||
store i32* %43, i32** %42, align 8
|
||||
%44 = bitcast %"int[]"* %vararg to { i8*, i64 }*
|
||||
%45 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %44, i32 0, i32 0
|
||||
%lo = load i8*, i8** %45, align 8
|
||||
%46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %44, i32 0, i32 1
|
||||
%hi = load i64, i64* %46, align 8
|
||||
%47 = call i32 @test.sum_us(i8* %lo, i64 %hi)
|
||||
%48 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.13, i32 0, i32 0), i32 %47)
|
||||
%add10 = add i32 %40, %48
|
||||
store i32 %add10, i32* %fro, align 4
|
||||
%48 = load i32, i32* %fro, align 4
|
||||
%49 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %48)
|
||||
%50 = bitcast [4 x i32]* %x to i32*
|
||||
%51 = insertvalue %"int[]" undef, i32* %50, 0
|
||||
%52 = insertvalue %"int[]" %51, i64 4, 1
|
||||
store %"int[]" %52, %"int[]"* %z, align 8
|
||||
%53 = bitcast [3 x i32]* %de to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %53, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false)
|
||||
%54 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 1
|
||||
%55 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 0
|
||||
store i64 4, i64* %54, align 8
|
||||
%56 = bitcast [4 x i32]* %x to i32*
|
||||
store i32* %56, i32** %55, align 8
|
||||
%57 = bitcast %"int[]"* %vararg11 to { i8*, i64 }*
|
||||
%58 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %57, i32 0, i32 0
|
||||
%lo12 = load i8*, i8** %58, align 8
|
||||
%59 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %57, i32 0, i32 1
|
||||
%hi13 = load i64, i64* %59, align 8
|
||||
%60 = call i32 @test.sum_us(i8* %lo12, i64 %hi13)
|
||||
%61 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.16, i32 0, i32 0), i32 %60)
|
||||
%62 = getelementptr inbounds %"int[]", %"int[]"* %vararg14, i32 0, i32 1
|
||||
%63 = getelementptr inbounds %"int[]", %"int[]"* %vararg14, i32 0, i32 0
|
||||
%64 = bitcast %"int[]"* %z to { i8*, i64 }*
|
||||
%65 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %64, i32 0, i32 0
|
||||
%lo15 = load i8*, i8** %65, align 8
|
||||
%66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %64, i32 0, i32 1
|
||||
%hi16 = load i64, i64* %66, align 8
|
||||
%67 = call i32 @test.sum_us(i8* %lo15, i64 %hi16)
|
||||
%68 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.17, i32 0, i32 0), i32 %67)
|
||||
%69 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0
|
||||
store i32 1, i32* %69, align 4
|
||||
%70 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 1
|
||||
store i32 2, i32* %70, align 4
|
||||
%71 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 2
|
||||
store i32 4, i32* %71, align 4
|
||||
%72 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3
|
||||
store i32 5, i32* %72, align 4
|
||||
%73 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 1
|
||||
store i64 4, i64* %73, align 8
|
||||
%74 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 0
|
||||
%75 = bitcast [4 x i32]* %varargslots to i32*
|
||||
store i32* %75, i32** %74, align 8
|
||||
%76 = bitcast %"int[]"* %vararg17 to { i8*, i64 }*
|
||||
%77 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %76, i32 0, i32 0
|
||||
%lo18 = load i8*, i8** %77, align 8
|
||||
%78 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %76, i32 0, i32 1
|
||||
%hi19 = load i64, i64* %78, align 8
|
||||
%79 = call i32 @test.sum_us(i8* %lo18, i64 %hi19)
|
||||
%80 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %79)
|
||||
%81 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots21, i64 0, i64 0
|
||||
store i32 1, i32* %81, align 4
|
||||
%82 = getelementptr inbounds %"int[]", %"int[]"* %vararg20, i32 0, i32 1
|
||||
store i64 1, i64* %82, align 8
|
||||
%83 = getelementptr inbounds %"int[]", %"int[]"* %vararg20, i32 0, i32 0
|
||||
%84 = bitcast [1 x i32]* %varargslots21 to i32*
|
||||
store i32* %84, i32** %83, align 8
|
||||
%85 = bitcast %"int[]"* %vararg20 to { i8*, i64 }*
|
||||
%86 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %85, i32 0, i32 0
|
||||
%lo22 = load i8*, i8** %86, align 8
|
||||
%87 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %85, i32 0, i32 1
|
||||
%hi23 = load i64, i64* %87, align 8
|
||||
%88 = call i32 @test.sum_us(i8* %lo22, i64 %hi23)
|
||||
%89 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %88)
|
||||
%90 = getelementptr inbounds %"int[]", %"int[]"* %vararg24, i32 0, i32 1
|
||||
store i64 0, i64* %90, align 8
|
||||
%91 = bitcast %"int[]"* %vararg24 to { i8*, i64 }*
|
||||
%92 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %91, i32 0, i32 0
|
||||
%lo25 = load i8*, i8** %92, align 8
|
||||
%93 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %91, i32 0, i32 1
|
||||
%hi26 = load i64, i64* %93, align 8
|
||||
%94 = call i32 @test.sum_us(i8* %lo25, i64 %hi26)
|
||||
%95 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %94)
|
||||
%49 = load i32, i32* %fro, align 4
|
||||
%50 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %49)
|
||||
%51 = bitcast [4 x i32]* %x to i32*
|
||||
%52 = insertvalue %"int[]" undef, i32* %51, 0
|
||||
%53 = insertvalue %"int[]" %52, i64 4, 1
|
||||
store %"int[]" %53, %"int[]"* %z, align 8
|
||||
%54 = bitcast [3 x i32]* %de to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %54, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false)
|
||||
%55 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 1
|
||||
%56 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 0
|
||||
store i64 4, i64* %55, align 8
|
||||
%57 = bitcast [4 x i32]* %x to i32*
|
||||
store i32* %57, i32** %56, align 8
|
||||
%58 = bitcast %"int[]"* %vararg11 to { i8*, i64 }*
|
||||
%59 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 0
|
||||
%lo12 = load i8*, i8** %59, align 8
|
||||
%60 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 1
|
||||
%hi13 = load i64, i64* %60, align 8
|
||||
%61 = call i32 @test.sum_us(i8* %lo12, i64 %hi13)
|
||||
%62 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.16, i32 0, i32 0), i32 %61)
|
||||
%63 = getelementptr inbounds %"int[]", %"int[]"* %vararg14, i32 0, i32 1
|
||||
%64 = getelementptr inbounds %"int[]", %"int[]"* %vararg14, i32 0, i32 0
|
||||
%65 = bitcast %"int[]"* %z to { i8*, i64 }*
|
||||
%66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 0
|
||||
%lo15 = load i8*, i8** %66, align 8
|
||||
%67 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 1
|
||||
%hi16 = load i64, i64* %67, align 8
|
||||
%68 = call i32 @test.sum_us(i8* %lo15, i64 %hi16)
|
||||
%69 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.17, i32 0, i32 0), i32 %68)
|
||||
%70 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0
|
||||
store i32 1, i32* %70, align 4
|
||||
%71 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 1
|
||||
store i32 2, i32* %71, align 4
|
||||
%72 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 2
|
||||
store i32 4, i32* %72, align 4
|
||||
%73 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3
|
||||
store i32 5, i32* %73, align 4
|
||||
%74 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 1
|
||||
store i64 4, i64* %74, align 8
|
||||
%75 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 0
|
||||
%76 = bitcast [4 x i32]* %varargslots to i32*
|
||||
store i32* %76, i32** %75, align 8
|
||||
%77 = bitcast %"int[]"* %vararg17 to { i8*, i64 }*
|
||||
%78 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %77, i32 0, i32 0
|
||||
%lo18 = load i8*, i8** %78, align 8
|
||||
%79 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %77, i32 0, i32 1
|
||||
%hi19 = load i64, i64* %79, align 8
|
||||
%80 = call i32 @test.sum_us(i8* %lo18, i64 %hi19)
|
||||
%81 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %80)
|
||||
%82 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots21, i64 0, i64 0
|
||||
store i32 1, i32* %82, align 4
|
||||
%83 = getelementptr inbounds %"int[]", %"int[]"* %vararg20, i32 0, i32 1
|
||||
store i64 1, i64* %83, align 8
|
||||
%84 = getelementptr inbounds %"int[]", %"int[]"* %vararg20, i32 0, i32 0
|
||||
%85 = bitcast [1 x i32]* %varargslots21 to i32*
|
||||
store i32* %85, i32** %84, align 8
|
||||
%86 = bitcast %"int[]"* %vararg20 to { i8*, i64 }*
|
||||
%87 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %86, i32 0, i32 0
|
||||
%lo22 = load i8*, i8** %87, align 8
|
||||
%88 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %86, i32 0, i32 1
|
||||
%hi23 = load i64, i64* %88, align 8
|
||||
%89 = call i32 @test.sum_us(i8* %lo22, i64 %hi23)
|
||||
%90 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %89)
|
||||
%91 = getelementptr inbounds %"int[]", %"int[]"* %vararg24, i32 0, i32 1
|
||||
store i64 0, i64* %91, align 8
|
||||
%92 = bitcast %"int[]"* %vararg24 to { i8*, i64 }*
|
||||
%93 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %92, i32 0, i32 0
|
||||
%lo25 = load i8*, i8** %93, align 8
|
||||
%94 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %92, i32 0, i32 1
|
||||
%hi26 = load i64, i64* %94, align 8
|
||||
%95 = call i32 @test.sum_us(i8* %lo25, i64 %hi26)
|
||||
%96 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %95)
|
||||
store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %a1, align 8
|
||||
store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %b2, align 8
|
||||
ret void
|
||||
|
||||
@@ -624,86 +624,88 @@ for.exit9: ; preds = %for.cond2
|
||||
%35 = call double @test2.double.getMult(double 3.300000e+00)
|
||||
%36 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.11, i32 0, i32 0), double %35)
|
||||
call void @test.helloWorld()
|
||||
%37 = bitcast %Foo* %ddx to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %37, i8 0, i64 8, i1 false)
|
||||
%37 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 0
|
||||
store i32 0, i32* %37, align 4
|
||||
%38 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 1
|
||||
store i32 0, i32* %38, align 4
|
||||
store i32 3, i32* %fro, align 4
|
||||
%38 = bitcast [4 x i32]* %x to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %38, i8* align 16 bitcast ([4 x i32]* @.__const.12 to i8*), i32 16, i1 false)
|
||||
%39 = load i32, i32* %fro, align 4
|
||||
%40 = getelementptr inbounds %"int[]", %"int[]"* %vararg, i32 0, i32 1
|
||||
%41 = getelementptr inbounds %"int[]", %"int[]"* %vararg, i32 0, i32 0
|
||||
store i64 4, i64* %40, align 8
|
||||
%42 = bitcast [4 x i32]* %x to i32*
|
||||
store i32* %42, i32** %41, align 8
|
||||
%43 = bitcast %"int[]"* %indirectarg to i8*
|
||||
%44 = bitcast %"int[]"* %vararg to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %43, i8* align 8 %44, i32 16, i1 false)
|
||||
%45 = call i32 @test.sum_us(%"int[]"* %indirectarg)
|
||||
%46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.13, i32 0, i32 0), i32 %45)
|
||||
%add10 = add i32 %39, %46
|
||||
%39 = bitcast [4 x i32]* %x to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %39, i8* align 16 bitcast ([4 x i32]* @.__const.12 to i8*), i32 16, i1 false)
|
||||
%40 = load i32, i32* %fro, align 4
|
||||
%41 = getelementptr inbounds %"int[]", %"int[]"* %vararg, i32 0, i32 1
|
||||
%42 = getelementptr inbounds %"int[]", %"int[]"* %vararg, i32 0, i32 0
|
||||
store i64 4, i64* %41, align 8
|
||||
%43 = bitcast [4 x i32]* %x to i32*
|
||||
store i32* %43, i32** %42, align 8
|
||||
%44 = bitcast %"int[]"* %indirectarg to i8*
|
||||
%45 = bitcast %"int[]"* %vararg to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %44, i8* align 8 %45, i32 16, i1 false)
|
||||
%46 = call i32 @test.sum_us(%"int[]"* %indirectarg)
|
||||
%47 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.13, i32 0, i32 0), i32 %46)
|
||||
%add10 = add i32 %40, %47
|
||||
store i32 %add10, i32* %fro, align 4
|
||||
%47 = load i32, i32* %fro, align 4
|
||||
%48 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %47)
|
||||
%49 = bitcast [4 x i32]* %x to i32*
|
||||
%50 = insertvalue %"int[]" undef, i32* %49, 0
|
||||
%51 = insertvalue %"int[]" %50, i64 4, 1
|
||||
store %"int[]" %51, %"int[]"* %z, align 8
|
||||
%52 = bitcast [3 x i32]* %de to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %52, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false)
|
||||
%53 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 1
|
||||
%54 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 0
|
||||
store i64 4, i64* %53, align 8
|
||||
%55 = bitcast [4 x i32]* %x to i32*
|
||||
store i32* %55, i32** %54, align 8
|
||||
%56 = bitcast %"int[]"* %indirectarg12 to i8*
|
||||
%57 = bitcast %"int[]"* %vararg11 to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %56, i8* align 8 %57, i32 16, i1 false)
|
||||
%58 = call i32 @test.sum_us(%"int[]"* %indirectarg12)
|
||||
%59 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.16, i32 0, i32 0), i32 %58)
|
||||
%60 = getelementptr inbounds %"int[]", %"int[]"* %vararg13, i32 0, i32 1
|
||||
%61 = getelementptr inbounds %"int[]", %"int[]"* %vararg13, i32 0, i32 0
|
||||
%62 = bitcast %"int[]"* %indirectarg14 to i8*
|
||||
%63 = bitcast %"int[]"* %z to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %62, i8* align 8 %63, i32 16, i1 false)
|
||||
%64 = call i32 @test.sum_us(%"int[]"* %indirectarg14)
|
||||
%65 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.17, i32 0, i32 0), i32 %64)
|
||||
%66 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0
|
||||
store i32 1, i32* %66, align 4
|
||||
%67 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 1
|
||||
store i32 2, i32* %67, align 4
|
||||
%68 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 2
|
||||
store i32 4, i32* %68, align 4
|
||||
%69 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3
|
||||
store i32 5, i32* %69, align 4
|
||||
%70 = getelementptr inbounds %"int[]", %"int[]"* %vararg15, i32 0, i32 1
|
||||
store i64 4, i64* %70, align 8
|
||||
%71 = getelementptr inbounds %"int[]", %"int[]"* %vararg15, i32 0, i32 0
|
||||
%72 = bitcast [4 x i32]* %varargslots to i32*
|
||||
store i32* %72, i32** %71, align 8
|
||||
%73 = bitcast %"int[]"* %indirectarg16 to i8*
|
||||
%74 = bitcast %"int[]"* %vararg15 to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %73, i8* align 8 %74, i32 16, i1 false)
|
||||
%75 = call i32 @test.sum_us(%"int[]"* %indirectarg16)
|
||||
%76 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %75)
|
||||
%77 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots18, i64 0, i64 0
|
||||
store i32 1, i32* %77, align 4
|
||||
%78 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 1
|
||||
store i64 1, i64* %78, align 8
|
||||
%79 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 0
|
||||
%80 = bitcast [1 x i32]* %varargslots18 to i32*
|
||||
store i32* %80, i32** %79, align 8
|
||||
%81 = bitcast %"int[]"* %indirectarg19 to i8*
|
||||
%82 = bitcast %"int[]"* %vararg17 to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %81, i8* align 8 %82, i32 16, i1 false)
|
||||
%83 = call i32 @test.sum_us(%"int[]"* %indirectarg19)
|
||||
%84 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %83)
|
||||
%85 = getelementptr inbounds %"int[]", %"int[]"* %vararg20, i32 0, i32 1
|
||||
store i64 0, i64* %85, align 8
|
||||
%86 = bitcast %"int[]"* %indirectarg21 to i8*
|
||||
%87 = bitcast %"int[]"* %vararg20 to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %86, i8* align 8 %87, i32 16, i1 false)
|
||||
%88 = call i32 @test.sum_us(%"int[]"* %indirectarg21)
|
||||
%89 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %88)
|
||||
%48 = load i32, i32* %fro, align 4
|
||||
%49 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %48)
|
||||
%50 = bitcast [4 x i32]* %x to i32*
|
||||
%51 = insertvalue %"int[]" undef, i32* %50, 0
|
||||
%52 = insertvalue %"int[]" %51, i64 4, 1
|
||||
store %"int[]" %52, %"int[]"* %z, align 8
|
||||
%53 = bitcast [3 x i32]* %de to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %53, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false)
|
||||
%54 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 1
|
||||
%55 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 0
|
||||
store i64 4, i64* %54, align 8
|
||||
%56 = bitcast [4 x i32]* %x to i32*
|
||||
store i32* %56, i32** %55, align 8
|
||||
%57 = bitcast %"int[]"* %indirectarg12 to i8*
|
||||
%58 = bitcast %"int[]"* %vararg11 to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %57, i8* align 8 %58, i32 16, i1 false)
|
||||
%59 = call i32 @test.sum_us(%"int[]"* %indirectarg12)
|
||||
%60 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.16, i32 0, i32 0), i32 %59)
|
||||
%61 = getelementptr inbounds %"int[]", %"int[]"* %vararg13, i32 0, i32 1
|
||||
%62 = getelementptr inbounds %"int[]", %"int[]"* %vararg13, i32 0, i32 0
|
||||
%63 = bitcast %"int[]"* %indirectarg14 to i8*
|
||||
%64 = bitcast %"int[]"* %z to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %63, i8* align 8 %64, i32 16, i1 false)
|
||||
%65 = call i32 @test.sum_us(%"int[]"* %indirectarg14)
|
||||
%66 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.17, i32 0, i32 0), i32 %65)
|
||||
%67 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0
|
||||
store i32 1, i32* %67, align 4
|
||||
%68 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 1
|
||||
store i32 2, i32* %68, align 4
|
||||
%69 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 2
|
||||
store i32 4, i32* %69, align 4
|
||||
%70 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3
|
||||
store i32 5, i32* %70, align 4
|
||||
%71 = getelementptr inbounds %"int[]", %"int[]"* %vararg15, i32 0, i32 1
|
||||
store i64 4, i64* %71, align 8
|
||||
%72 = getelementptr inbounds %"int[]", %"int[]"* %vararg15, i32 0, i32 0
|
||||
%73 = bitcast [4 x i32]* %varargslots to i32*
|
||||
store i32* %73, i32** %72, align 8
|
||||
%74 = bitcast %"int[]"* %indirectarg16 to i8*
|
||||
%75 = bitcast %"int[]"* %vararg15 to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %74, i8* align 8 %75, i32 16, i1 false)
|
||||
%76 = call i32 @test.sum_us(%"int[]"* %indirectarg16)
|
||||
%77 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %76)
|
||||
%78 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots18, i64 0, i64 0
|
||||
store i32 1, i32* %78, align 4
|
||||
%79 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 1
|
||||
store i64 1, i64* %79, align 8
|
||||
%80 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 0
|
||||
%81 = bitcast [1 x i32]* %varargslots18 to i32*
|
||||
store i32* %81, i32** %80, align 8
|
||||
%82 = bitcast %"int[]"* %indirectarg19 to i8*
|
||||
%83 = bitcast %"int[]"* %vararg17 to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %82, i8* align 8 %83, i32 16, i1 false)
|
||||
%84 = call i32 @test.sum_us(%"int[]"* %indirectarg19)
|
||||
%85 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %84)
|
||||
%86 = getelementptr inbounds %"int[]", %"int[]"* %vararg20, i32 0, i32 1
|
||||
store i64 0, i64* %86, align 8
|
||||
%87 = bitcast %"int[]"* %indirectarg21 to i8*
|
||||
%88 = bitcast %"int[]"* %vararg20 to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %87, i8* align 8 %88, i32 16, i1 false)
|
||||
%89 = call i32 @test.sum_us(%"int[]"* %indirectarg21)
|
||||
%90 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %89)
|
||||
store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %a1, align 8
|
||||
store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %b2, align 8
|
||||
ret void
|
||||
|
||||
@@ -63,27 +63,27 @@ entry:
|
||||
%baz = alloca [3 x %Baz], align 16
|
||||
%0 = bitcast %Baz* %ffe to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %0, i8* align 8 bitcast ({ i32, [4 x i8] }* @.__const to i8*), i32 8, i1 false)
|
||||
%1 = bitcast [1 x i32]* %azz to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %1, i8 0, i64 4, i1 false)
|
||||
%2 = bitcast [0 x i32]* %a to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %2, i8 0, i64 0, i1 false)
|
||||
%1 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0
|
||||
store i32 0, i32* %1, align 4
|
||||
store i32 33, i32* %foo2, align 4
|
||||
store i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i8** %str, align 8
|
||||
%3 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 0
|
||||
store i32 1, i32* %3, align 4
|
||||
%4 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 1
|
||||
store i32 2, i32* %4, align 4
|
||||
%5 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 2
|
||||
store i32 3, i32* %5, align 4
|
||||
%6 = bitcast [3 x i32]* %literal to i32*
|
||||
%7 = insertvalue %"int[]" undef, i32* %6, 0
|
||||
%8 = insertvalue %"int[]" %7, i64 3, 1
|
||||
%len = extractvalue %"int[]" %8, 1
|
||||
%2 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 0
|
||||
store i32 1, i32* %2, align 4
|
||||
%3 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 1
|
||||
store i32 2, i32* %3, align 4
|
||||
%4 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 2
|
||||
store i32 3, i32* %4, align 4
|
||||
%5 = bitcast [3 x i32]* %literal to i32*
|
||||
%6 = insertvalue %"int[]" undef, i32* %5, 0
|
||||
%7 = insertvalue %"int[]" %6, i64 3, 1
|
||||
%len = extractvalue %"int[]" %7, 1
|
||||
%not = icmp eq i64 %len, 0
|
||||
%9 = zext i1 %not to i8
|
||||
store i8 %9, i8* %x, align 1
|
||||
%10 = bitcast %Bar* %b to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %10, i8 0, i64 8, i1 false)
|
||||
%8 = zext i1 %not to i8
|
||||
store i8 %8, i8* %x, align 1
|
||||
%9 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0
|
||||
store i32 0, i32* %9, align 4
|
||||
%10 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1
|
||||
store i32 0, i32* %10, align 4
|
||||
%11 = bitcast %Baz* %z to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 8 %11, i8 0, i64 8, i1 false)
|
||||
store [0 x i32] zeroinitializer, [0 x i32]* %literal1, align 4
|
||||
|
||||
@@ -132,35 +132,35 @@ entry:
|
||||
%28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.8, i32 0, i32 0), i32 %27)
|
||||
%29 = bitcast %Baz* %ffe to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %29, i8* align 8 bitcast ({ i32, [4 x i8] }* @.__const to i8*), i32 8, i1 false)
|
||||
%30 = bitcast [1 x i32]* %azz to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %30, i8 0, i64 4, i1 false)
|
||||
%31 = bitcast [0 x i32]* %a to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %31, i8 0, i64 0, i1 false)
|
||||
%32 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 0
|
||||
store i32 1, i32* %32, align 4
|
||||
%33 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 1
|
||||
store i32 2, i32* %33, align 4
|
||||
%34 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 2
|
||||
store i32 3, i32* %34, align 4
|
||||
%35 = bitcast [3 x i32]* %literal6 to i32*
|
||||
%36 = insertvalue %"int[]" undef, i32* %35, 0
|
||||
%37 = insertvalue %"int[]" %36, i64 3, 1
|
||||
%len = extractvalue %"int[]" %37, 1
|
||||
%30 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0
|
||||
store i32 0, i32* %30, align 4
|
||||
%31 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 0
|
||||
store i32 1, i32* %31, align 4
|
||||
%32 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 1
|
||||
store i32 2, i32* %32, align 4
|
||||
%33 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 2
|
||||
store i32 3, i32* %33, align 4
|
||||
%34 = bitcast [3 x i32]* %literal6 to i32*
|
||||
%35 = insertvalue %"int[]" undef, i32* %34, 0
|
||||
%36 = insertvalue %"int[]" %35, i64 3, 1
|
||||
%len = extractvalue %"int[]" %36, 1
|
||||
%not = icmp eq i64 %len, 0
|
||||
%38 = zext i1 %not to i8
|
||||
store i8 %38, i8* %xy, align 1
|
||||
%39 = load i8, i8* %xy, align 1
|
||||
%40 = trunc i8 %39 to i1
|
||||
%not7 = xor i1 %40, true
|
||||
%37 = zext i1 %not to i8
|
||||
store i8 %37, i8* %xy, align 1
|
||||
%38 = load i8, i8* %xy, align 1
|
||||
%39 = trunc i8 %38 to i1
|
||||
%not7 = xor i1 %39, true
|
||||
br i1 %not7, label %if.then, label %if.exit
|
||||
|
||||
if.then: ; preds = %entry
|
||||
%41 = call i32 @"std::io.println"(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0)) #3
|
||||
%40 = call i32 @"std::io.println"(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0)) #3
|
||||
br label %if.exit
|
||||
|
||||
if.exit: ; preds = %if.then, %entry
|
||||
%42 = bitcast %Bar* %b to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %42, i8 0, i64 8, i1 false)
|
||||
%41 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0
|
||||
store i32 0, i32* %41, align 4
|
||||
%42 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1
|
||||
store i32 0, i32* %42, align 4
|
||||
%43 = bitcast %Baz* %z to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 8 %43, i8 0, i64 8, i1 false)
|
||||
store [0 x i32] zeroinitializer, [0 x i32]* %literal8, align 4
|
||||
|
||||
@@ -10,8 +10,15 @@ struct Bar
|
||||
int x;
|
||||
int y;
|
||||
}
|
||||
|
||||
struct Mega
|
||||
{
|
||||
int[10] z;
|
||||
}
|
||||
|
||||
fn int test()
|
||||
{
|
||||
Mega m = {};
|
||||
int[1] azz = {};
|
||||
int[*] a = {};
|
||||
Bar b = {};
|
||||
@@ -24,17 +31,13 @@ fn int test()
|
||||
|
||||
// #expect: zero_init.ll
|
||||
|
||||
%Mega = type { [10 x i32] }
|
||||
%Bar = type { i32, i32 }
|
||||
%Baz = type { double }
|
||||
%"int[]" = type { i32*, i64 }
|
||||
%"Bar[]" = type { %Bar*, i64 }
|
||||
|
||||
@Baz = linkonce_odr constant i8 1
|
||||
@Bar = linkonce_odr constant i8 1
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define i32 @zero_init.test() #0 {
|
||||
entry:
|
||||
%m = alloca %Mega, align 4
|
||||
%azz = alloca [1 x i32], align 4
|
||||
%a = alloca [0 x i32], align 4
|
||||
%b = alloca %Bar, align 4
|
||||
@@ -44,25 +47,27 @@ entry:
|
||||
%foo = alloca %"Bar[]", align 8
|
||||
%literal1 = alloca [0 x %Bar], align 4
|
||||
%baz = alloca [3 x %Baz], align 16
|
||||
%0 = bitcast [1 x i32]* %azz to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 4, i1 false)
|
||||
%1 = bitcast [0 x i32]* %a to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %1, i8 0, i64 0, i1 false)
|
||||
%2 = bitcast %Bar* %b to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %2, i8 0, i64 8, i1 false)
|
||||
%3 = bitcast %Baz* %z to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 8 %3, i8 0, i64 8, i1 false)
|
||||
%0 = bitcast %Mega* %m to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 40, i1 false)
|
||||
%1 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0
|
||||
store i32 0, i32* %1, align 4
|
||||
%2 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0
|
||||
store i32 0, i32* %2, align 4
|
||||
%3 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1
|
||||
store i32 0, i32* %3, align 4
|
||||
%4 = bitcast %Baz* %z to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 8 %4, i8 0, i64 8, i1 false)
|
||||
store [0 x i32] zeroinitializer, [0 x i32]* %literal, align 4
|
||||
%4 = bitcast [0 x i32]* %literal to i32*
|
||||
%5 = insertvalue %"int[]" undef, i32* %4, 0
|
||||
%6 = insertvalue %"int[]" %5, i64 0, 1
|
||||
store %"int[]" %6, %"int[]"* %sub, align 8
|
||||
%5 = bitcast [0 x i32]* %literal to i32*
|
||||
%6 = insertvalue %"int[]" undef, i32* %5, 0
|
||||
%7 = insertvalue %"int[]" %6, i64 0, 1
|
||||
store %"int[]" %7, %"int[]"* %sub, align 8
|
||||
store [0 x %Bar] zeroinitializer, [0 x %Bar]* %literal1, align 4
|
||||
%7 = bitcast [0 x %Bar]* %literal1 to %Bar*
|
||||
%8 = insertvalue %"Bar[]" undef, %Bar* %7, 0
|
||||
%9 = insertvalue %"Bar[]" %8, i64 0, 1
|
||||
store %"Bar[]" %9, %"Bar[]"* %foo, align 8
|
||||
%10 = bitcast [3 x %Baz]* %baz to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 16 %10, i8 0, i64 24, i1 false)
|
||||
%8 = bitcast [0 x %Bar]* %literal1 to %Bar*
|
||||
%9 = insertvalue %"Bar[]" undef, %Bar* %8, 0
|
||||
%10 = insertvalue %"Bar[]" %9, i64 0, 1
|
||||
store %"Bar[]" %10, %"Bar[]"* %foo, align 8
|
||||
%11 = bitcast [3 x %Baz]* %baz to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 16 %11, i8 0, i64 24, i1 false)
|
||||
ret i32 1
|
||||
}
|
||||
|
||||
@@ -92,13 +92,21 @@ entry:
|
||||
%to = alloca i16*, align 8
|
||||
%i = alloca i64, align 8
|
||||
store i16 %0, i16* %x, align 2
|
||||
%1 = bitcast %Foo* %z to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 2 %1, i8 0, i64 8, i1 false)
|
||||
%2 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 0
|
||||
%3 = load i16, i16* %x, align 2
|
||||
store i16 %3, i16* %2, align 2
|
||||
%4 = load %Foo, %Foo* %z, align 2
|
||||
store %Foo %4, %Foo* %expr, align 2
|
||||
%1 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 0
|
||||
store i16 0, i16* %1, align 2
|
||||
%2 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 1
|
||||
store i8 0, i8* %2, align 2
|
||||
%3 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 2
|
||||
store i8 0, i8* %3, align 1
|
||||
%4 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 3
|
||||
store i16 0, i16* %4, align 2
|
||||
%5 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 4
|
||||
store i16 0, i16* %5, align 2
|
||||
%6 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 0
|
||||
%7 = load i16, i16* %x, align 2
|
||||
store i16 %7, i16* %6, align 2
|
||||
%8 = load %Foo, %Foo* %z, align 2
|
||||
store %Foo %8, %Foo* %expr, align 2
|
||||
%ptrptr = bitcast %Foo* %expr to i16*
|
||||
store i16* %ptrptr, i16** %b, align 8
|
||||
%ptrptr2 = bitcast i64* %x1 to i16*
|
||||
@@ -107,30 +115,30 @@ entry:
|
||||
br label %for.cond
|
||||
|
||||
for.cond: ; preds = %for.inc, %entry
|
||||
%5 = load i64, i64* %i, align 8
|
||||
%lt = icmp ult i64 %5, 8
|
||||
%9 = load i64, i64* %i, align 8
|
||||
%lt = icmp ult i64 %9, 8
|
||||
br i1 %lt, label %for.body, label %for.exit
|
||||
|
||||
for.body: ; preds = %for.cond
|
||||
%6 = load i16*, i16** %to, align 8
|
||||
%7 = load i64, i64* %i, align 8
|
||||
%ptroffset = getelementptr inbounds i16, i16* %6, i64 %7
|
||||
%8 = load i16*, i16** %b, align 8
|
||||
%9 = load i64, i64* %i, align 8
|
||||
%ptroffset3 = getelementptr inbounds i16, i16* %8, i64 %9
|
||||
%10 = load i16, i16* %ptroffset3, align 2
|
||||
store i16 %10, i16* %ptroffset, align 2
|
||||
%10 = load i16*, i16** %to, align 8
|
||||
%11 = load i64, i64* %i, align 8
|
||||
%ptroffset = getelementptr inbounds i16, i16* %10, i64 %11
|
||||
%12 = load i16*, i16** %b, align 8
|
||||
%13 = load i64, i64* %i, align 8
|
||||
%ptroffset3 = getelementptr inbounds i16, i16* %12, i64 %13
|
||||
%14 = load i16, i16* %ptroffset3, align 2
|
||||
store i16 %14, i16* %ptroffset, align 2
|
||||
br label %for.inc
|
||||
|
||||
for.inc: ; preds = %for.body
|
||||
%11 = load i64, i64* %i, align 8
|
||||
%add = add i64 %11, 2
|
||||
%15 = load i64, i64* %i, align 8
|
||||
%add = add i64 %15, 2
|
||||
store i64 %add, i64* %i, align 8
|
||||
br label %for.cond
|
||||
|
||||
for.exit: ; preds = %for.cond
|
||||
%12 = load i64, i64* %x1, align 8
|
||||
ret i64 %12
|
||||
%16 = load i64, i64* %x1, align 8
|
||||
ret i64 %16
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// #target: x64-darwin
|
||||
module test;
|
||||
|
||||
fn void test()
|
||||
@@ -14,45 +15,57 @@ fn void test()
|
||||
|
||||
// #expect: test.ll
|
||||
|
||||
define void @test.test() #0 {
|
||||
entry:
|
||||
%x = alloca [3 x i32], align 4
|
||||
%g = alloca i32, align 4
|
||||
%idx = alloca i64, align 8
|
||||
%z = alloca i32, align 4
|
||||
%0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0
|
||||
store i32 0, i32* %0, align 4
|
||||
%1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1
|
||||
store i32 0, i32* %1, align 4
|
||||
%2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2
|
||||
store i32 0, i32* %2, align 4
|
||||
store i32 0, i32* %g, align 4
|
||||
store i64 0, i64* %idx, align 8
|
||||
br label %foreach.cond
|
||||
|
||||
foreach.cond: ; preds = %foreach.inc, %entry
|
||||
%1 = load i64, i64* %idx, align 8
|
||||
%lt = icmp ult i64 %1, 3
|
||||
%3 = load i64, i64* %idx, align 8
|
||||
%lt = icmp ult i64 %3, 3
|
||||
br i1 %lt, label %foreach.body, label %foreach.exit
|
||||
|
||||
foreach.body: ; preds = %foreach.cond
|
||||
%ptroffset = getelementptr inbounds i32, [3 x i32]* %x, i64 %1
|
||||
%2 = load i32, i32* %ptroffset, align 4
|
||||
store i32 %2, i32* %z, align 4
|
||||
%3 = load i32, i32* %z, align 4
|
||||
%gt = icmp sgt i32 %3, 0
|
||||
%ptroffset = getelementptr inbounds i32, [3 x i32]* %x, i64 %3
|
||||
%4 = load i32, i32* %ptroffset, align 4
|
||||
store i32 %4, i32* %z, align 4
|
||||
%5 = load i32, i32* %z, align 4
|
||||
%gt = icmp sgt i32 %5, 0
|
||||
br i1 %gt, label %if.then, label %if.exit
|
||||
|
||||
if.then: ; preds = %foreach.body
|
||||
br label %foreach.exit
|
||||
|
||||
if.exit: ; preds = %foreach.body
|
||||
%4 = load i32, i32* %z, align 4
|
||||
%eq = icmp eq i32 %4, 1
|
||||
%6 = load i32, i32* %z, align 4
|
||||
%eq = icmp eq i32 %6, 1
|
||||
br i1 %eq, label %if.then1, label %if.exit2
|
||||
|
||||
if.then1: ; preds = %if.exit
|
||||
br label %foreach.inc
|
||||
|
||||
if.exit2: ; preds = %if.exit
|
||||
%5 = load i32, i32* %g, align 4
|
||||
%6 = load i32, i32* %z, align 4
|
||||
%add = add i32 %5, %6
|
||||
%7 = load i32, i32* %g, align 4
|
||||
%8 = load i32, i32* %z, align 4
|
||||
%add = add i32 %7, %8
|
||||
store i32 %add, i32* %g, align 4
|
||||
br label %foreach.inc
|
||||
|
||||
foreach.inc: ; preds = %if.exit2, %if.then1
|
||||
%7 = load i64, i64* %idx, align 8
|
||||
%8 = add i64 %7, 1
|
||||
store i64 %8, i64* %idx, align 8
|
||||
%9 = load i64, i64* %idx, align 8
|
||||
%10 = add i64 %9, 1
|
||||
store i64 %10, i64* %idx, align 8
|
||||
br label %foreach.cond
|
||||
|
||||
foreach.exit: ; preds = %if.then, %foreach.cond
|
||||
|
||||
Reference in New Issue
Block a user