1; RUN: opt -scalarrepl -S < %s | FileCheck %s 2 3target 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-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 4target triple = "x86_64-unknown-linux-gnu" 5 6declare void @llvm.lifetime.start(i64, i8*) 7declare void @llvm.lifetime.end(i64, i8*) 8 9%t1 = type {i32, i32, i32} 10 11define void @test1() { 12; CHECK: @test1 13 %A = alloca %t1 14 %A1 = getelementptr %t1* %A, i32 0, i32 0 15 %A2 = getelementptr %t1* %A, i32 0, i32 1 16 %A3 = getelementptr %t1* %A, i32 0, i32 2 17 %B = bitcast i32* %A1 to i8* 18 store i32 0, i32* %A1 19 call void @llvm.lifetime.start(i64 -1, i8* %B) 20 ret void 21; CHECK-NEXT: ret void 22} 23 24define void @test2() { 25; CHECK: @test2 26 %A = alloca %t1 27 %A1 = getelementptr %t1* %A, i32 0, i32 0 28 %A2 = getelementptr %t1* %A, i32 0, i32 1 29 %A3 = getelementptr %t1* %A, i32 0, i32 2 30 %B = bitcast i32* %A2 to i8* 31 store i32 0, i32* %A2 32 call void @llvm.lifetime.start(i64 -1, i8* %B) 33 %C = load i32* %A2 34 ret void 35; CHECK: ret void 36} 37 38define void @test3() { 39; CHECK: @test3 40 %A = alloca %t1 41 %A1 = getelementptr %t1* %A, i32 0, i32 0 42 %A2 = getelementptr %t1* %A, i32 0, i32 1 43 %A3 = getelementptr %t1* %A, i32 0, i32 2 44 %B = bitcast i32* %A2 to i8* 45 store i32 0, i32* %A2 46 call void @llvm.lifetime.start(i64 6, i8* %B) 47 %C = load i32* %A2 48 ret void 49; CHECK-NEXT: ret void 50} 51 52define void @test4() { 53; CHECK: @test4 54 %A = alloca %t1 55 %A1 = getelementptr %t1* %A, i32 0, i32 0 56 %A2 = getelementptr %t1* %A, i32 0, i32 1 57 %A3 = getelementptr %t1* %A, i32 0, i32 2 58 %B = bitcast i32* %A2 to i8* 59 store i32 0, i32* %A2 60 call void @llvm.lifetime.start(i64 1, i8* %B) 61 %C = load i32* %A2 62 ret void 63; CHECK-NEXT: ret void 64} 65 66%t2 = type {i32, [4 x i8], i32} 67 68define void @test5() { 69; CHECK: @test5 70 %A = alloca %t2 71; CHECK: alloca{{.*}}i8 72; CHECK: alloca{{.*}}i8 73; CHECK: alloca{{.*}}i8 74 75 %A21 = getelementptr %t2* %A, i32 0, i32 1, i32 0 76 %A22 = getelementptr %t2* %A, i32 0, i32 1, i32 1 77 %A23 = getelementptr %t2* %A, i32 0, i32 1, i32 2 78 %A24 = getelementptr %t2* %A, i32 0, i32 1, i32 3 79; CHECK-NOT: store i8 1 80 store i8 1, i8* %A21 81 store i8 2, i8* %A22 82 store i8 3, i8* %A23 83 store i8 4, i8* %A24 84 85 %A1 = getelementptr %t2* %A, i32 0, i32 0 86 %A2 = getelementptr %t2* %A, i32 0, i32 1, i32 1 87 %A3 = getelementptr %t2* %A, i32 0, i32 2 88 store i8 0, i8* %A2 89 call void @llvm.lifetime.start(i64 5, i8* %A2) 90; CHECK: llvm.lifetime{{.*}}i64 1 91; CHECK: llvm.lifetime{{.*}}i64 1 92; CHECK: llvm.lifetime{{.*}}i64 1 93 %C = load i8* %A2 94 ret void 95} 96 97%t3 = type {[4 x i16], [4 x i8]} 98 99define void @test6() { 100; CHECK: @test6 101 %A = alloca %t3 102; CHECK: alloca i8 103; CHECK: alloca i8 104; CHECK: alloca i8 105 106 %A11 = getelementptr %t3* %A, i32 0, i32 0, i32 0 107 %A12 = getelementptr %t3* %A, i32 0, i32 0, i32 1 108 %A13 = getelementptr %t3* %A, i32 0, i32 0, i32 2 109 %A14 = getelementptr %t3* %A, i32 0, i32 0, i32 3 110 store i16 11, i16* %A11 111 store i16 12, i16* %A12 112 store i16 13, i16* %A13 113 store i16 14, i16* %A14 114; CHECK-NOT: store i16 11 115; CHECK-NOT: store i16 12 116; CHECK-NOT: store i16 13 117; CHECK-NOT: store i16 14 118 119 %A21 = getelementptr %t3* %A, i32 0, i32 1, i32 0 120 %A22 = getelementptr %t3* %A, i32 0, i32 1, i32 1 121 %A23 = getelementptr %t3* %A, i32 0, i32 1, i32 2 122 %A24 = getelementptr %t3* %A, i32 0, i32 1, i32 3 123 store i8 21, i8* %A21 124 store i8 22, i8* %A22 125 store i8 23, i8* %A23 126 store i8 24, i8* %A24 127; CHECK: store i8 21 128; CHECK: store i8 22 129; CHECK: store i8 23 130; CHECK-NOT: store i8 24 131 132 %B = bitcast i16* %A13 to i8* 133 call void @llvm.lifetime.start(i64 7, i8* %B) 134; CHECK: lifetime.start{{.*}}i64 1 135; CHECK: lifetime.start{{.*}}i64 1 136; CHECK: lifetime.start{{.*}}i64 1 137 138 ret void 139} 140