1 ; RUN: opt < %s -inline -S | FileCheck %s 2 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 define void @foo(%struct.s* byval nocapture readonly %a) { 9 entry: 10 %x = alloca [2 x i32], align 4 11 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0 12 %0 = load i32* %a1, align 4 13 %arrayidx = getelementptr inbounds [2 x i32]* %x, i64 0, i64 0 14 store i32 %0, i32* %arrayidx, align 4 15 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1 16 %1 = load i32* %b, align 4 17 %arrayidx2 = getelementptr inbounds [2 x i32]* %x, i64 0, i64 1 18 store i32 %1, i32* %arrayidx2, align 4 19 call void @bar(i32* %arrayidx) #2 20 ret void 21 } 22 23 define void @foo0(%struct.s* byval nocapture readonly %a) { 24 entry: 25 %x = alloca [2 x i32] 26 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0 27 %0 = load i32* %a1, align 4 28 %arrayidx = getelementptr inbounds [2 x i32]* %x, i64 0, i64 0 29 store i32 %0, i32* %arrayidx, align 4 30 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1 31 %1 = load i32* %b, align 4 32 %arrayidx2 = getelementptr inbounds [2 x i32]* %x, i64 0, i64 1 33 store i32 %1, i32* %arrayidx2, align 4 34 call void @bar(i32* %arrayidx) #2 35 ret void 36 } 37 38 define void @foo1(%struct.s* byval nocapture readonly %a) { 39 entry: 40 %x = alloca [2 x i32], align 1 41 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0 42 %0 = load i32* %a1, align 4 43 %arrayidx = getelementptr inbounds [2 x i32]* %x, i64 0, i64 0 44 store i32 %0, i32* %arrayidx, align 4 45 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1 46 %1 = load i32* %b, align 4 47 %arrayidx2 = getelementptr inbounds [2 x i32]* %x, i64 0, i64 1 48 store i32 %1, i32* %arrayidx2, align 4 49 call void @bar(i32* %arrayidx) #2 50 ret void 51 } 52 53 declare void @bar(i32*) #1 54 55 define void @goo(%struct.s* byval nocapture readonly %a) { 56 entry: 57 %x = alloca [2 x i32], align 32 58 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0 59 %0 = load i32* %a1, align 4 60 %arrayidx = getelementptr inbounds [2 x i32]* %x, i64 0, i64 0 61 store i32 %0, i32* %arrayidx, align 32 62 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1 63 %1 = load i32* %b, align 4 64 %arrayidx2 = getelementptr inbounds [2 x i32]* %x, i64 0, i64 1 65 store i32 %1, i32* %arrayidx2, align 4 66 call void @bar(i32* %arrayidx) #2 67 ret void 68 } 69 70 ; CHECK-LABEL: @main 71 ; CHECK: alloca [2 x i32], align 32 72 ; CHECK-NOT: alloca [2 x i32] 73 ; CHECK: ret i32 0 74 75 define signext i32 @main() { 76 entry: 77 %a = alloca i64, align 8 78 %tmpcast = bitcast i64* %a to %struct.s* 79 store i64 0, i64* %a, align 8 80 %a1 = bitcast i64* %a to i32* 81 store i32 1, i32* %a1, align 8 82 call void @foo(%struct.s* byval %tmpcast) 83 store i32 2, i32* %a1, align 8 84 call void @goo(%struct.s* byval %tmpcast) 85 ret i32 0 86 } 87 88 ; CHECK-LABEL: @test0 89 ; CHECK: alloca [2 x i32], align 32 90 ; CHECK-NOT: alloca [2 x i32] 91 ; CHECK: ret i32 0 92 93 define signext i32 @test0() { 94 entry: 95 %a = alloca i64, align 8 96 %tmpcast = bitcast i64* %a to %struct.s* 97 store i64 0, i64* %a, align 8 98 %a1 = bitcast i64* %a to i32* 99 store i32 1, i32* %a1, align 8 100 call void @foo0(%struct.s* byval %tmpcast) 101 store i32 2, i32* %a1, align 8 102 call void @goo(%struct.s* byval %tmpcast) 103 ret i32 0 104 } 105 106 ; CHECK-LABEL: @test1 107 ; CHECK: {{alloca \[2 x i32\]$}} 108 ; CHECK-NOT: alloca [2 x i32] 109 ; CHECK: ret i32 0 110 111 define signext i32 @test1() { 112 entry: 113 %a = alloca i64, align 8 114 %tmpcast = bitcast i64* %a to %struct.s* 115 store i64 0, i64* %a, align 8 116 %a1 = bitcast i64* %a to i32* 117 store i32 1, i32* %a1, align 8 118 call void @foo0(%struct.s* byval %tmpcast) 119 store i32 2, i32* %a1, align 8 120 call void @foo1(%struct.s* byval %tmpcast) 121 ret i32 0 122 } 123