| // RUN: %target-swift-frontend %s -emit-ir | FileCheck %s |
| |
| // REQUIRES: CPU=x86_64 |
| |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| |
| struct BigStruct { |
| var x, y, z, w : Int |
| } |
| |
| sil @alloc_small : $(@inout Builtin.UnsafeValueBuffer, Int) -> () { |
| entry(%b : $*Builtin.UnsafeValueBuffer, %v : $Int): |
| %0 = alloc_value_buffer $Int in %b : $*Builtin.UnsafeValueBuffer |
| store %v to %0 : $*Int |
| %r = tuple () |
| return %r : $() |
| } |
| // CHECK-LABEL: define{{( protected)?}} void @alloc_small([24 x i8]* nocapture dereferenceable({{.*}}), i64) |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to %Si* |
| // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 %1, i64* [[T2]], align 8 |
| // CHECK-NEXT: ret void |
| |
| sil @project_small : $(@inout Builtin.UnsafeValueBuffer, Int) -> () { |
| entry(%b : $*Builtin.UnsafeValueBuffer, %v : $Int): |
| %0 = project_value_buffer $Int in %b : $*Builtin.UnsafeValueBuffer |
| store %v to %0 : $*Int |
| %r = tuple () |
| return %r : $() |
| } |
| // CHECK-LABEL: define{{( protected)?}} void @project_small([24 x i8]* nocapture dereferenceable({{.*}}), i64) |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to %Si* |
| // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 %1, i64* [[T2]], align 8 |
| // CHECK-NEXT: ret void |
| |
| sil @dealloc_small : $(@inout Builtin.UnsafeValueBuffer) -> () { |
| entry(%b : $*Builtin.UnsafeValueBuffer): |
| dealloc_value_buffer $Int in %b : $*Builtin.UnsafeValueBuffer |
| %r = tuple () |
| return %r : $() |
| } |
| // CHECK-LABEL: define{{( protected)?}} void @dealloc_small([24 x i8]* nocapture dereferenceable({{.*}})) |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: ret void |
| |
| sil @alloc_big : $(@inout Builtin.UnsafeValueBuffer, BigStruct) -> () { |
| entry(%b : $*Builtin.UnsafeValueBuffer, %v : $BigStruct): |
| %0 = alloc_value_buffer $BigStruct in %b : $*Builtin.UnsafeValueBuffer |
| store %v to %0 : $*BigStruct |
| %r = tuple () |
| return %r : $() |
| } |
| // CHECK-LABEL: define{{( protected)?}} void @alloc_big([24 x i8]* nocapture dereferenceable({{.*}}), %V13value_buffers9BigStruct* noalias nocapture dereferenceable({{.*}})) |
| // CHECK-NEXT: entry: |
| // CHECK: [[SLOT0:%.*]] = load i64 |
| // CHECK: [[SLOT1:%.*]] = load i64 |
| // CHECK: [[SLOT2:%.*]] = load i64 |
| // CHECK: [[SLOT3:%.*]] = load i64 |
| // CHECK-NEXT: [[T0:%.*]] = call noalias i8* @rt_swift_slowAlloc(i64 32, i64 7) |
| // CHECK-NEXT: [[T1:%.*]] = bitcast [24 x i8]* %0 to i8** |
| // CHECK-NEXT: store i8* [[T0]], i8** [[T1]], align 8 |
| // CHECK-NEXT: [[ADDR:%.*]] = bitcast i8* [[T0]] to %V13value_buffers9BigStruct* |
| // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 0 |
| // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 [[SLOT0]], i64* [[T1]], align 8 |
| // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 1 |
| // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 [[SLOT1]], i64* [[T1]], align 8 |
| // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 2 |
| // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 [[SLOT2]], i64* [[T1]], align 8 |
| // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 3 |
| // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 [[SLOT3]], i64* [[T1]], align 8 |
| // CHECK-NEXT: ret void |
| |
| sil @project_big : $(@inout Builtin.UnsafeValueBuffer, BigStruct) -> () { |
| entry(%b : $*Builtin.UnsafeValueBuffer, %v : $BigStruct): |
| %0 = project_value_buffer $BigStruct in %b : $*Builtin.UnsafeValueBuffer |
| store %v to %0 : $*BigStruct |
| %r = tuple () |
| return %r : $() |
| } |
| // CHECK-LABEL: define{{( protected)?}} void @project_big([24 x i8]* nocapture dereferenceable({{.*}}), %V13value_buffers9BigStruct* noalias nocapture dereferenceable({{.*}})) |
| // CHECK-NEXT: entry: |
| // CHECK: [[SLOT0:%.*]] = load i64 |
| // CHECK: [[SLOT1:%.*]] = load i64 |
| // CHECK: [[SLOT2:%.*]] = load i64 |
| // CHECK: [[SLOT3:%.*]] = load i64 |
| // CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to %V13value_buffers9BigStruct** |
| // CHECK-NEXT: [[ADDR:%.*]] = load %V13value_buffers9BigStruct*, %V13value_buffers9BigStruct** [[T0]], align 8 |
| // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 0 |
| // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 [[SLOT0]], i64* [[T1]], align 8 |
| // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 1 |
| // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 [[SLOT1]], i64* [[T1]], align 8 |
| // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 2 |
| // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 [[SLOT2]], i64* [[T1]], align 8 |
| // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 3 |
| // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0 |
| // CHECK-NEXT: store i64 [[SLOT3]], i64* [[T1]], align 8 |
| // CHECK-NEXT: ret void |
| |
| sil @dealloc_big : $(@inout Builtin.UnsafeValueBuffer) -> () { |
| entry(%b : $*Builtin.UnsafeValueBuffer): |
| dealloc_value_buffer $BigStruct in %b : $*Builtin.UnsafeValueBuffer |
| %r = tuple () |
| return %r : $() |
| } |
| // CHECK-LABEL: define{{( protected)?}} void @dealloc_big([24 x i8]* nocapture dereferenceable({{.*}})) |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to i8** |
| // CHECK-NEXT: [[ADDR:%.*]] = load i8*, i8** [[T0]], align 8 |
| // CHECK-NEXT: call void @rt_swift_slowDealloc(i8* [[ADDR]], i64 32, i64 7) |
| // CHECK-NEXT: ret void |