1; RUN: llc -mcpu=pwr7 < %s | FileCheck %s
2target datalayout = "e-m:e-i64:64-n32:64"
3target triple = "powerpc64le-unknown-linux-gnu"
4
5; Make sure that we don't generate a std r, 0(0) -- the memory address cannot
6; be stored in r0.
7; CHECK-LABEL: @test1
8; CHECK-NOT: std {{[0-9]+}}, 0(0)
9; CHECK: blr
10
11define void @test1({ i8*, void (i8*, i8*)* } %fn_arg) {
12  %fn = alloca { i8*, void (i8*, i8*)* }
13  %sp = alloca i8*, align 8
14  %regs = alloca [18 x i64], align 8
15  store { i8*, void (i8*, i8*)* } %fn_arg, { i8*, void (i8*, i8*)* }* %fn
16  %1 = bitcast [18 x i64]* %regs to i64*
17  call void asm sideeffect "std  14, $0", "=*m"(i64* %1)
18  %2 = bitcast [18 x i64]* %regs to i8*
19  %3 = getelementptr i8* %2, i32 8
20  %4 = bitcast i8* %3 to i64*
21  call void asm sideeffect "std  15, $0", "=*m"(i64* %4)
22  %5 = bitcast [18 x i64]* %regs to i8*
23  %6 = getelementptr i8* %5, i32 16
24  %7 = bitcast i8* %6 to i64*
25  call void asm sideeffect "std  16, $0", "=*m"(i64* %7)
26  %8 = bitcast [18 x i64]* %regs to i8*
27  %9 = getelementptr i8* %8, i32 24
28  %10 = bitcast i8* %9 to i64*
29  call void asm sideeffect "std  17, $0", "=*m"(i64* %10)
30  %11 = bitcast [18 x i64]* %regs to i8*
31  %12 = getelementptr i8* %11, i32 32
32  %13 = bitcast i8* %12 to i64*
33  call void asm sideeffect "std  18, $0", "=*m"(i64* %13)
34  %14 = bitcast [18 x i64]* %regs to i8*
35  %15 = getelementptr i8* %14, i32 40
36  %16 = bitcast i8* %15 to i64*
37  call void asm sideeffect "std  19, $0", "=*m"(i64* %16)
38  %17 = bitcast [18 x i64]* %regs to i8*
39  %18 = getelementptr i8* %17, i32 48
40  %19 = bitcast i8* %18 to i64*
41  call void asm sideeffect "std  20, $0", "=*m"(i64* %19)
42  %20 = bitcast [18 x i64]* %regs to i8*
43  %21 = getelementptr i8* %20, i32 56
44  %22 = bitcast i8* %21 to i64*
45  call void asm sideeffect "std  21, $0", "=*m"(i64* %22)
46  %23 = bitcast [18 x i64]* %regs to i8*
47  %24 = getelementptr i8* %23, i32 64
48  %25 = bitcast i8* %24 to i64*
49  call void asm sideeffect "std  22, $0", "=*m"(i64* %25)
50  %26 = bitcast [18 x i64]* %regs to i8*
51  %27 = getelementptr i8* %26, i32 72
52  %28 = bitcast i8* %27 to i64*
53  call void asm sideeffect "std  23, $0", "=*m"(i64* %28)
54  %29 = bitcast [18 x i64]* %regs to i8*
55  %30 = getelementptr i8* %29, i32 80
56  %31 = bitcast i8* %30 to i64*
57  call void asm sideeffect "std  24, $0", "=*m"(i64* %31)
58  %32 = bitcast [18 x i64]* %regs to i8*
59  %33 = getelementptr i8* %32, i32 88
60  %34 = bitcast i8* %33 to i64*
61  call void asm sideeffect "std  25, $0", "=*m"(i64* %34)
62  %35 = bitcast [18 x i64]* %regs to i8*
63  %36 = getelementptr i8* %35, i32 96
64  %37 = bitcast i8* %36 to i64*
65  call void asm sideeffect "std  26, $0", "=*m"(i64* %37)
66  %38 = bitcast [18 x i64]* %regs to i8*
67  %39 = getelementptr i8* %38, i32 104
68  %40 = bitcast i8* %39 to i64*
69  call void asm sideeffect "std  27, $0", "=*m"(i64* %40)
70  %41 = bitcast [18 x i64]* %regs to i8*
71  %42 = getelementptr i8* %41, i32 112
72  %43 = bitcast i8* %42 to i64*
73  call void asm sideeffect "std  28, $0", "=*m"(i64* %43)
74  %44 = bitcast [18 x i64]* %regs to i8*
75  %45 = getelementptr i8* %44, i32 120
76  %46 = bitcast i8* %45 to i64*
77  call void asm sideeffect "std  29, $0", "=*m"(i64* %46)
78  %47 = bitcast [18 x i64]* %regs to i8*
79  %48 = getelementptr i8* %47, i32 128
80  %49 = bitcast i8* %48 to i64*
81  call void asm sideeffect "std  30, $0", "=*m"(i64* %49)
82  %50 = bitcast [18 x i64]* %regs to i8*
83  %51 = getelementptr i8* %50, i32 136
84  %52 = bitcast i8* %51 to i64*
85  call void asm sideeffect "std  31, $0", "=*m"(i64* %52)
86  %53 = getelementptr { i8*, void (i8*, i8*)* }* %fn, i32 0, i32 1
87  %.funcptr = load void (i8*, i8*)** %53
88  %54 = getelementptr { i8*, void (i8*, i8*)* }* %fn, i32 0, i32 0
89  %.ptr = load i8** %54
90  %55 = load i8** %sp
91  call void %.funcptr(i8* %.ptr, i8* %55)
92  ret void
93}
94
95