~pali/+junk/llvm-toolchain-3.7

« back to all changes in this revision

Viewing changes to test/CodeGen/PowerPC/emptystruct.ll

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2015-07-15 17:51:08 UTC
  • Revision ID: package-import@ubuntu.com-20150715175108-l8mynwovkx4zx697
Tags: upstream-3.7~+rc2
ImportĀ upstreamĀ versionĀ 3.7~+rc2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
; RUN: llc -mcpu=pwr7 -O0 -fast-isel=false < %s | FileCheck %s
 
2
 
 
3
; This tests correct handling of empty aggregate parameters and return values.
 
4
; An empty parameter passed by value does not consume a protocol register or
 
5
; a parameter save area doubleword.  An empty parameter passed by reference
 
6
; is treated as any other pointer parameter.  An empty aggregate return value 
 
7
; is treated as any other aggregate return value, passed via address as a 
 
8
; hidden parameter in GPR3.  In this example, GPR3 contains the return value
 
9
; address, GPR4 contains the address of e2, and e1 and e3 are not passed or
 
10
; received.
 
11
 
 
12
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
 
13
target triple = "powerpc64-unknown-linux-gnu"
 
14
 
 
15
%struct.empty = type {}
 
16
 
 
17
define void @callee(%struct.empty* noalias sret %agg.result, %struct.empty* byval %a1, %struct.empty* %a2, %struct.empty* byval %a3) nounwind {
 
18
entry:
 
19
  %a2.addr = alloca %struct.empty*, align 8
 
20
  store %struct.empty* %a2, %struct.empty** %a2.addr, align 8
 
21
  %0 = load %struct.empty*, %struct.empty** %a2.addr, align 8
 
22
  %1 = bitcast %struct.empty* %agg.result to i8*
 
23
  %2 = bitcast %struct.empty* %0 to i8*
 
24
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 0, i32 1, i1 false)
 
25
  ret void
 
26
}
 
27
 
 
28
; CHECK-LABEL: callee:
 
29
; CHECK: std 4,
 
30
; CHECK-NOT: std 5,
 
31
; CHECK-NOT: std 6,
 
32
; CHECK: blr
 
33
 
 
34
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
 
35
 
 
36
define void @caller(%struct.empty* noalias sret %agg.result) nounwind {
 
37
entry:
 
38
  %e1 = alloca %struct.empty, align 1
 
39
  %e2 = alloca %struct.empty, align 1
 
40
  %e3 = alloca %struct.empty, align 1
 
41
  call void @callee(%struct.empty* sret %agg.result, %struct.empty* byval %e1, %struct.empty* %e2, %struct.empty* byval %e3)
 
42
  ret void
 
43
}
 
44
 
 
45
; CHECK-LABEL: caller:
 
46
; CHECK: addi 4,
 
47
; CHECK-NOT: std 5,
 
48
; CHECK-NOT: std 6,
 
49
; CHECK: bl callee