1 ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s 2 ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -disable-fp-elim < %s | FileCheck -check-prefix=CHECK-FP %s 3 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" 4 target triple = "powerpc64-unknown-linux-gnu" 5 6 %struct.s = type { i32, i32 } 7 8 declare void @bar(i32*) 9 10 define void @goo(%struct.s* byval nocapture readonly %a) { 11 entry: 12 %x = alloca [2 x i32], align 32 13 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0 14 %0 = load i32* %a1, align 4, !tbaa !0 15 %arrayidx = getelementptr inbounds [2 x i32]* %x, i64 0, i64 0 16 store i32 %0, i32* %arrayidx, align 32, !tbaa !0 17 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1 18 %1 = load i32* %b, align 4, !tbaa !0 19 %arrayidx2 = getelementptr inbounds [2 x i32]* %x, i64 0, i64 1 20 store i32 %1, i32* %arrayidx2, align 4, !tbaa !0 21 call void @bar(i32* %arrayidx) 22 ret void 23 } 24 25 ; CHECK-LABEL: @goo 26 27 ; CHECK-DAG: mflr 0 28 ; CHECK-DAG: rldicl [[REG:[0-9]+]], 1, 0, 59 29 ; CHECK-DAG: std 30, -16(1) 30 ; CHECK-DAG: mr 30, 1 31 ; CHECK-DAG: std 0, 16(1) 32 ; CHECK-DAG: subfic 0, [[REG]], -160 33 ; CHECK: stdux 1, 1, 0 34 35 ; CHECK: .cfi_offset r30, -16 36 ; CHECK: .cfi_offset lr, 16 37 38 ; CHECK: std 3, 48(30) 39 40 ; CHECK: ld 1, 0(1) 41 ; CHECK-DAG: ld 0, 16(1) 42 ; CHECK-DAG: ld 30, -16(1) 43 ; CHECK-DAG: mtlr 0 44 ; CHECK: blr 45 46 ; CHECK-FP-LABEL: @goo 47 48 ; CHECK-FP-DAG: mflr 0 49 ; CHECK-FP-DAG: rldicl [[REG:[0-9]+]], 1, 0, 59 50 ; CHECK-FP-DAG: std 31, -8(1) 51 ; CHECK-FP-DAG: std 30, -16(1) 52 ; CHECK-FP-DAG: mr 30, 1 53 ; CHECK-FP-DAG: std 0, 16(1) 54 ; CHECK-FP-DAG: subfic 0, [[REG]], -160 55 ; CHECK-FP: stdux 1, 1, 0 56 57 ; CHECK-FP: .cfi_offset r31, -8 58 ; CHECK-FP: .cfi_offset r30, -16 59 ; CHECK-FP: .cfi_offset lr, 16 60 61 ; CHECK-FP: mr 31, 1 62 63 ; CHECK-FP: std 3, 48(30) 64 65 ; CHECK-FP: ld 1, 0(1) 66 ; CHECK-FP-DAG: ld 0, 16(1) 67 ; CHECK-FP-DAG: ld 31, -8(1) 68 ; CHECK-FP-DAG: ld 30, -16(1) 69 ; CHECK-FP-DAG: mtlr 0 70 ; CHECK-FP: blr 71 72 ; The large-frame-size case. 73 define void @hoo(%struct.s* byval nocapture readonly %a) { 74 entry: 75 %x = alloca [200000 x i32], align 32 76 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0 77 %0 = load i32* %a1, align 4, !tbaa !0 78 %arrayidx = getelementptr inbounds [200000 x i32]* %x, i64 0, i64 0 79 store i32 %0, i32* %arrayidx, align 32, !tbaa !0 80 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1 81 %1 = load i32* %b, align 4, !tbaa !0 82 %arrayidx2 = getelementptr inbounds [200000 x i32]* %x, i64 0, i64 1 83 store i32 %1, i32* %arrayidx2, align 4, !tbaa !0 84 call void @bar(i32* %arrayidx) 85 ret void 86 } 87 88 ; CHECK-LABEL: @hoo 89 90 ; CHECK-DAG: lis [[REG1:[0-9]+]], -13 91 ; CHECK-DAG: rldicl [[REG3:[0-9]+]], 1, 0, 59 92 ; CHECK-DAG: mflr 0 93 ; CHECK-DAG: ori [[REG2:[0-9]+]], [[REG1]], 51808 94 ; CHECK-DAG: std 30, -16(1) 95 ; CHECK-DAG: mr 30, 1 96 ; CHECK-DAG: std 0, 16(1) 97 ; CHECK-DAG: subfc 0, [[REG3]], [[REG2]] 98 ; CHECK: stdux 1, 1, 0 99 100 ; CHECK: blr 101 102 ; Make sure that the FP save area is still allocated correctly relative to 103 ; where r30 is saved. 104 define void @loo(%struct.s* byval nocapture readonly %a) { 105 entry: 106 %x = alloca [2 x i32], align 32 107 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0 108 %0 = load i32* %a1, align 4, !tbaa !0 109 %arrayidx = getelementptr inbounds [2 x i32]* %x, i64 0, i64 0 110 store i32 %0, i32* %arrayidx, align 32, !tbaa !0 111 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1 112 %1 = load i32* %b, align 4, !tbaa !0 113 %arrayidx2 = getelementptr inbounds [2 x i32]* %x, i64 0, i64 1 114 store i32 %1, i32* %arrayidx2, align 4, !tbaa !0 115 call void @bar(i32* %arrayidx) 116 call void asm sideeffect "", "~{f30}"() nounwind 117 ret void 118 } 119 120 ; CHECK-LABEL: @loo 121 122 ; CHECK-DAG: mflr 0 123 ; CHECK-DAG: rldicl [[REG:[0-9]+]], 1, 0, 59 124 ; CHECK-DAG: std 30, -32(1) 125 ; CHECK-DAG: mr 30, 1 126 ; CHECK-DAG: std 0, 16(1) 127 ; CHECK-DAG: subfic 0, [[REG]], -192 128 ; CHECK: stdux 1, 1, 0 129 130 ; CHECK: stfd 30, -16(30) 131 132 ; CHECK: blr 133 134 ; CHECK-FP-LABEL: @loo 135 136 ; CHECK-FP-DAG: mflr 0 137 ; CHECK-FP-DAG: rldicl [[REG:[0-9]+]], 1, 0, 59 138 ; CHECK-FP-DAG: std 31, -24(1) 139 ; CHECK-FP-DAG: std 30, -32(1) 140 ; CHECK-FP-DAG: mr 30, 1 141 ; CHECK-FP-DAG: std 0, 16(1) 142 ; CHECK-FP-DAG: subfic 0, [[REG]], -192 143 ; CHECK-FP: stdux 1, 1, 0 144 145 ; CHECK-FP: stfd 30, -16(30) 146 147 ; CHECK-FP: blr 148 149 !0 = metadata !{metadata !"int", metadata !1} 150 !1 = metadata !{metadata !"omnipotent char", metadata !2} 151 !2 = metadata !{metadata !"Simple C/C++ TBAA"} 152