1 // RUN: %clang_cc1 -std=c++11 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s 2 3 // CHECK: @[[ABC4:.*]] = {{.*}} constant [4 x i8] c"abc\00" 4 // CHECK: @[[ABC15:.*]] = {{.*}} constant [15 x i8] c"abc\00\00\00\00 5 6 // CHECK-LABEL: define void @_Z2fni 7 void fn(int n) { 8 // CHECK: icmp ult i{{32|64}} %{{[^ ]+}}, 3 9 // CHECK: store i32 1 10 // CHECK: store i32 2 11 // CHECK: store i32 3 12 // CHECK: sub {{.*}}, 12 13 // CHECK: call void @llvm.memset 14 new int[n] { 1, 2, 3 }; 15 } 16 17 // CHECK-LABEL: define void @_Z11const_exactv 18 void const_exact() { 19 // CHECK-NOT: icmp ult i{{32|64}} %{{[^ ]+}}, 3 20 // CHECK-NOT: icmp eq i32* 21 new int[3] { 1, 2, 3 }; 22 } 23 24 // CHECK-LABEL: define void @_Z16const_sufficientv 25 void const_sufficient() { 26 // CHECK-NOT: icmp ult i{{32|64}} %{{[^ ]+}}, 3 27 new int[4] { 1, 2, 3 }; 28 // CHECK: ret void 29 } 30 31 // CHECK-LABEL: define void @_Z22check_array_value_initv 32 void check_array_value_init() { 33 struct S; 34 new (int S::*[3][4][5]) (); 35 36 // CHECK: call i8* @_Zna{{.}}(i{{32 240|64 480}}) 37 // CHECK: getelementptr inbounds i{{32|64}}, i{{32|64}}* {{.*}}, i{{32|64}} 60 38 39 // CHECK: phi 40 // CHECK: store i{{32|64}} -1, 41 // CHECK: getelementptr inbounds i{{32|64}}, i{{32|64}}* {{.*}}, i{{32|64}} 1 42 // CHECK: icmp eq 43 // CHECK: br i1 44 } 45 46 // CHECK-LABEL: define void @_Z15string_nonconsti 47 void string_nonconst(int n) { 48 // CHECK: icmp slt i{{32|64}} %{{[^ ]+}}, 4 49 // FIXME: Conditionally throw an exception rather than passing -1 to alloc function 50 // CHECK: select 51 // CHECK: %[[PTR:.*]] = call i8* @_Zna{{.}}(i{{32|64}} 52 // CHECK: call void @llvm.memcpy{{.*}}(i8* %[[PTR]], i8* getelementptr inbounds ([4 x i8], [4 x i8]* @[[ABC4]], i32 0, i32 0), i32 4, 53 // CHECK: %[[REST:.*]] = getelementptr inbounds i8, i8* %[[PTR]], i32 4 54 // CHECK: %[[RESTSIZE:.*]] = sub {{.*}}, 4 55 // CHECK: call void @llvm.memset{{.*}}(i8* %[[REST]], i8 0, i{{32|64}} %[[RESTSIZE]], 56 new char[n] { "abc" }; 57 } 58 59 // CHECK-LABEL: define void @_Z12string_exactv 60 void string_exact() { 61 // CHECK-NOT: icmp 62 // CHECK: %[[PTR:.*]] = call i8* @_Zna{{.}}(i{{32|64}} 4) 63 // CHECK: call void @llvm.memcpy{{.*}}(i8* %[[PTR]], i8* getelementptr inbounds ([4 x i8], [4 x i8]* @[[ABC4]], i32 0, i32 0), i32 4, 64 // CHECK-NOT: memset 65 new char[4] { "abc" }; 66 } 67 68 // CHECK-LABEL: define void @_Z17string_sufficientv 69 void string_sufficient() { 70 // CHECK-NOT: icmp 71 // CHECK: %[[PTR:.*]] = call i8* @_Zna{{.}}(i{{32|64}} 15) 72 // FIXME: For very large arrays, it would be preferable to emit a small copy and a memset. 73 // CHECK: call void @llvm.memcpy{{.*}}(i8* %[[PTR]], i8* getelementptr inbounds ([15 x i8], [15 x i8]* @[[ABC15]], i32 0, i32 0), i32 15, 74 // CHECK-NOT: memset 75 new char[15] { "abc" }; 76 } 77 78 // CHECK-LABEL: define void @_Z10aggr_exactv 79 void aggr_exact() { 80 // CHECK-NOT: icmp 81 // CHECK: %[[MEM:.*]] = call i8* @_Zna{{.}}(i{{32|64}} 16) 82 // CHECK: %[[PTR0:.*]] = bitcast i8* %[[MEM]] to %[[AGGR:.*]]* 83 // CHECK: %[[FIELD:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR0]], i32 0, i32 0{{$}} 84 // CHECK: store i32 1, i32* %[[FIELD]] 85 // CHECK: %[[FIELD:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR0]], i32 0, i32 1{{$}} 86 // CHECK: store i32 2, i32* %[[FIELD]] 87 // CHECK: %[[PTR1:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR0]], i32 1{{$}} 88 // CHECK: %[[FIELD:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR1]], i32 0, i32 0{{$}} 89 // CHECK: store i32 3, i32* %[[FIELD]] 90 // CHECK: %[[FIELD:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR1]], i32 0, i32 1{{$}} 91 // CHECK: store i32 0, i32* %[[FIELD]] 92 // CHECK-NOT: store 93 // CHECK-NOT: memset 94 struct Aggr { int a, b; }; 95 new Aggr[2] { 1, 2, 3 }; 96 } 97 98 // CHECK-LABEL: define void @_Z15aggr_sufficienti 99 void aggr_sufficient(int n) { 100 // CHECK: icmp ult i32 %{{.*}}, 2 101 // CHECK: %[[MEM:.*]] = call i8* @_Zna{{.}}( 102 // CHECK: %[[PTR0:.*]] = bitcast i8* %[[MEM]] to %[[AGGR:.*]]* 103 // CHECK: %[[FIELD:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR0]], i32 0, i32 0{{$}} 104 // CHECK: store i32 1, i32* %[[FIELD]] 105 // CHECK: %[[FIELD:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR0]], i32 0, i32 1{{$}} 106 // CHECK: store i32 2, i32* %[[FIELD]] 107 // CHECK: %[[PTR1:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR0]], i32 1{{$}} 108 // CHECK: %[[FIELD:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR1]], i32 0, i32 0{{$}} 109 // CHECK: store i32 3, i32* %[[FIELD]] 110 // CHECK: %[[FIELD:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR1]], i32 0, i32 1{{$}} 111 // CHECK: store i32 0, i32* %[[FIELD]] 112 // CHECK: %[[PTR2:.*]] = getelementptr inbounds %[[AGGR]], %[[AGGR]]* %[[PTR1]], i32 1{{$}} 113 // CHECK: %[[REMAIN:.*]] = sub i32 {{.*}}, 16 114 // CHECK: %[[MEM:.*]] = bitcast %[[AGGR]]* %[[PTR2]] to i8* 115 // CHECK: call void @llvm.memset{{.*}}(i8* %[[MEM]], i8 0, i32 %[[REMAIN]], 116 struct Aggr { int a, b; }; 117 new Aggr[n] { 1, 2, 3 }; 118 } 119