array initializers

Trass3r via Digitalmars-d digitalmars-d at puremagic.com
Fri Jul 11 16:08:29 PDT 2014


> auto foo() {
>    immutable int[] arr = [0, 1, 0, 3];
>    return arr;
> }
> ---
> produces (with optimizations on, but just for brevity)
> ---
> define { i64, i32* } @_D4test3fooFZyAi() #0 {
>   ret { i64, i32* } { i64 4, i32* getelementptr inbounds ([4 x 
> i32]* @.immutablearray, i32 0, i32 0) }
> }
> ---

Indeed. But

bool blub()
{
	immutable int[] arr = [0,0,0,0,0,0,0,0];
	return arr == [1,1,1,1,1,1,1,1];
}

yields

@.immutablearray = internal constant [8 x i32] zeroinitializer
@.arrayliteral = internal unnamed_addr constant [8 x i32] [i32 1, 
i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1]

define i1 @_D13arrayliterals4blubFZb() #0 {
   %.gc_mem = tail call { i64, i8* } 
@_d_newarrayvT(%object.TypeInfo* @_D11TypeInfo_Ai6__initZ, i64 8)
   %.ptr = extractvalue { i64, i8* } %.gc_mem, 1
   tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %.ptr, i8* 
bitcast ([8 x i32]* @.arrayliteral to i8*), i64 32, i32 1, i1 
false)
   %tmp27 = tail call i32 @_adEq2({ i64, i8* } { i64 8, i8* 
bitcast ([8 x i32]* @.immutablearray to i8*) }, { i64, i8* } 
%.gc_mem, %object.TypeInfo* bitcast (%"typeid(immutable(int)[])"* 
@_D12TypeInfo_Ayi6__initZ to %object.TypeInfo*)) #2
   %tmp28 = icmp ne i32 %tmp27, 0
   ret i1 %tmp28
}


More information about the Digitalmars-d mailing list