Revision 2f78b708576de5a8011bd267953c7b795564b440 authored by Chris Lattner on 12 January 2016, 06:43:27 UTC, committed by Chris Lattner on 12 January 2016, 06:43:27 UTC
1 parent e30cd93
Raw File
alignment.sil
// RUN: %target-swift-frontend -emit-ir %s | FileCheck %s

import Swift

@_alignment(16) struct Foo { var x, y, z, w: Float }
@_alignment(16) enum Empty {}
@_alignment(16) enum Singleton { case V4(Float, Float, Float, Float) }
@_alignment(16) enum NoPayload { case A, B, C }
@_alignment(16) enum SinglePayload { case A(Float), B, C }
@_alignment(16) enum MultiPayload { case A(Float), B(Float), C }

sil @test_alignment : $@convention(thin) () -> () {
entry:
  // CHECK: alloca %V9alignment3Foo, align 16
  %a = alloc_stack $*Foo
  // CHECK: alloca %O9alignment9Singleton, align 16
  %b = alloc_stack $*Singleton
  %c = alloc_stack $*Empty
  // CHECK: alloca %O9alignment9NoPayload, align 16
  %d = alloc_stack $*NoPayload
  // CHECK: alloca %O9alignment13SinglePayload, align 16
  %e = alloc_stack $*SinglePayload
  // CHECK: alloca %O9alignment12MultiPayload, align 16
  %f = alloc_stack $*MultiPayload

  // CHECK: load float{{.*}}, align 16
  // CHECK: load float{{.*}}, align 4
  // CHECK: load float{{.*}}, align 8
  // CHECK: load float{{.*}}, align 4
  %z = load %a : $*Foo
  // CHECK: store float{{.*}}, align 16
  // CHECK: store float{{.*}}, align 4
  // CHECK: store float{{.*}}, align 8
  // CHECK: store float{{.*}}, align 4
  store %z to %a : $*Foo

  // CHECK: load float{{.*}}, align 16
  // CHECK: load float{{.*}}, align 4
  // CHECK: load float{{.*}}, align 8
  // CHECK: load float{{.*}}, align 4
  %y = load %b : $*Singleton

  // CHECK: store float{{.*}}, align 16
  // CHECK: store float{{.*}}, align 4
  // CHECK: store float{{.*}}, align 8
  // CHECK: store float{{.*}}, align 4
  store %y to %b : $*Singleton

  %x = load %c : $*Empty
  store %x to %c : $*Empty

  // CHECK: load i2{{.*}}, align 16
  %w = load %d : $*NoPayload
  // CHECK: store i2{{.*}}, align 16
  store %w to %d : $*NoPayload

  // CHECK: load i32{{.*}}, align 16
  // CHECK: load i1{{.*}}, align 4
  %v = load %e : $*SinglePayload
  // CHECK: store i32{{.*}}, align 16
  // CHECK: store i1{{.*}}, align 4
  store %v to %e : $*SinglePayload

  // CHECK: load i32{{.*}}, align 16
  // CHECK: load i2{{.*}}, align 4
  %u = load %f : $*MultiPayload
  // CHECK: store i32{{.*}}, align 16
  // CHECK: store i2{{.*}}, align 4
  store %u to %f : $*MultiPayload

  dealloc_stack %f : $*MultiPayload
  dealloc_stack %e : $*SinglePayload
  dealloc_stack %d : $*NoPayload
  dealloc_stack %c : $*Empty
  dealloc_stack %b : $*Singleton
  dealloc_stack %a : $*Foo
  return undef : $()
}
back to top