1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; Verify that strlen calls with elements of constant arrays are folded. 3; 4; RUN: opt < %s -passes=instcombine -S | FileCheck %s 5 6declare i64 @strlen(ptr) 7 8@a5_4 = constant [5 x [4 x i8]] [[4 x i8] c"123\00", [4 x i8] c"12\00\00", [4 x i8] c"1\00\00\00", [4 x i8] zeroinitializer, [4 x i8] zeroinitializer] 9 10 11; Fold strlen(a5_4[0]) to 3. 12 13define i64 @fold_a5_4_i0_to_3() { 14; CHECK-LABEL: @fold_a5_4_i0_to_3( 15; CHECK-NEXT: ret i64 3 16; 17 %len = call i64 @strlen(ptr @a5_4) 18 ret i64 %len 19} 20 21 22; Fold strlen(&a5_4[0][1]) to 2. 23 24define i64 @fold_a5_4_i0_p1_to_2() { 25; CHECK-LABEL: @fold_a5_4_i0_p1_to_2( 26; CHECK-NEXT: ret i64 2 27; 28 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 1 29 %len = call i64 @strlen(ptr %ptr) 30 ret i64 %len 31} 32 33 34; Fold strlen(&a5_4[0][2]) to 1. 35 36define i64 @fold_a5_4_i0_p2_to_1() { 37; CHECK-LABEL: @fold_a5_4_i0_p2_to_1( 38; CHECK-NEXT: ret i64 1 39; 40 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 2 41 %len = call i64 @strlen(ptr %ptr) 42 ret i64 %len 43} 44 45 46; Fold strlen(&a5_4[0][3]) to 0. 47 48define i64 @fold_a5_4_i0_p3_to_0() { 49; CHECK-LABEL: @fold_a5_4_i0_p3_to_0( 50; CHECK-NEXT: ret i64 0 51; 52 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 3 53 %len = call i64 @strlen(ptr %ptr) 54 ret i64 %len 55} 56 57 58; Fold strlen(a5_4[1]) to 2. 59 60define i64 @fold_a5_4_i1_to_2() { 61; CHECK-LABEL: @fold_a5_4_i1_to_2( 62; CHECK-NEXT: ret i64 2 63; 64 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 0 65 %len = call i64 @strlen(ptr %ptr) 66 ret i64 %len 67} 68 69 70; Fold strlen(&a5_4[1][1]) to 1. 71 72define i64 @fold_a5_4_i1_p1_to_1() { 73; CHECK-LABEL: @fold_a5_4_i1_p1_to_1( 74; CHECK-NEXT: ret i64 1 75; 76 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 1 77 %len = call i64 @strlen(ptr %ptr) 78 ret i64 %len 79} 80 81 82; Fold strlen(&a5_4[1][2]) to 0. 83 84define i64 @fold_a5_4_i1_p2_to_0() { 85; CHECK-LABEL: @fold_a5_4_i1_p2_to_0( 86; CHECK-NEXT: ret i64 0 87; 88 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 2 89 %len = call i64 @strlen(ptr %ptr) 90 ret i64 %len 91} 92 93 94; Fold strlen(&a5_4[1][3]) to 0. 95 96define i64 @fold_a5_4_i1_p3_to_0() { 97; CHECK-LABEL: @fold_a5_4_i1_p3_to_0( 98; CHECK-NEXT: ret i64 0 99; 100 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 3 101 %len = call i64 @strlen(ptr %ptr) 102 ret i64 %len 103} 104 105 106; Fold strlen(a5_4[2]) to 1. 107 108define i64 @fold_a5_4_i2_to_1() { 109; CHECK-LABEL: @fold_a5_4_i2_to_1( 110; CHECK-NEXT: ret i64 1 111; 112 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 0 113 %len = call i64 @strlen(ptr %ptr) 114 ret i64 %len 115} 116 117 118; Fold strlen(&a5_4[2][1]) to 0. 119 120define i64 @fold_a5_4_i2_p1_to_0() { 121; CHECK-LABEL: @fold_a5_4_i2_p1_to_0( 122; CHECK-NEXT: ret i64 0 123; 124 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 1 125 %len = call i64 @strlen(ptr %ptr) 126 ret i64 %len 127} 128 129 130; Fold strlen(&a5_4[2][2]) to 0. 131 132define i64 @fold_a5_4_i2_p2_to_0() { 133; CHECK-LABEL: @fold_a5_4_i2_p2_to_0( 134; CHECK-NEXT: ret i64 0 135; 136 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 2 137 %len = call i64 @strlen(ptr %ptr) 138 ret i64 %len 139} 140 141 142; Fold strlen(&a5_4[2][3]) to 0. 143 144define i64 @fold_a5_4_i2_p3_to_0() { 145; CHECK-LABEL: @fold_a5_4_i2_p3_to_0( 146; CHECK-NEXT: ret i64 0 147; 148 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 3 149 %len = call i64 @strlen(ptr %ptr) 150 ret i64 %len 151} 152 153 154; Fold strlen(a5_4[3]) to 0 155 156define i64 @fold_a5_4_i3_to_0() { 157; CHECK-LABEL: @fold_a5_4_i3_to_0( 158; CHECK-NEXT: ret i64 0 159; 160 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 0 161 %len = call i64 @strlen(ptr %ptr) 162 ret i64 %len 163} 164 165 166; Fold strlen(&a5_4[3][1]) to 0 167 168define i64 @fold_a5_4_i3_p1_to_0() { 169; CHECK-LABEL: @fold_a5_4_i3_p1_to_0( 170; CHECK-NEXT: ret i64 0 171; 172 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 1 173 %len = call i64 @strlen(ptr %ptr) 174 ret i64 %len 175} 176 177 178; Fold strlen(&a5_4[3][2]) to 0 179 180define i64 @fold_a5_4_i3_p2_to_0() { 181; CHECK-LABEL: @fold_a5_4_i3_p2_to_0( 182; CHECK-NEXT: ret i64 0 183; 184 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 2 185 %len = call i64 @strlen(ptr %ptr) 186 ret i64 %len 187} 188 189 190; Fold strlen(&a5_4[3][3]) to 0 191 192define i64 @fold_a5_3_i4_p3_to_0() { 193; CHECK-LABEL: @fold_a5_3_i4_p3_to_0( 194; CHECK-NEXT: ret i64 0 195; 196 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 3 197 %len = call i64 @strlen(ptr %ptr) 198 ret i64 %len 199} 200 201 202; Fold strlen(a5_4[4]) to 0 203 204define i64 @fold_a5_4_i4_to_0() { 205; CHECK-LABEL: @fold_a5_4_i4_to_0( 206; CHECK-NEXT: ret i64 0 207; 208 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 0 209 %len = call i64 @strlen(ptr %ptr) 210 ret i64 %len 211} 212 213 214; Fold strlen(&a5_4[4][1]) to 0 215 216define i64 @fold_a5_4_i4_p1_to_0() { 217; CHECK-LABEL: @fold_a5_4_i4_p1_to_0( 218; CHECK-NEXT: ret i64 0 219; 220 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 1 221 %len = call i64 @strlen(ptr %ptr) 222 ret i64 %len 223} 224 225 226; Fold strlen(&a5_4[4][2]) to 0 227 228define i64 @fold_a5_4_i4_p2_to_0() { 229; CHECK-LABEL: @fold_a5_4_i4_p2_to_0( 230; CHECK-NEXT: ret i64 0 231; 232 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 2 233 %len = call i64 @strlen(ptr %ptr) 234 ret i64 %len 235} 236 237 238; Fold strlen(&a5_4[4][3]) to 0 239 240define i64 @fold_a5_4_i4_p3_to_0() { 241; CHECK-LABEL: @fold_a5_4_i4_p3_to_0( 242; CHECK-NEXT: ret i64 0 243; 244 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 3 245 %len = call i64 @strlen(ptr %ptr) 246 ret i64 %len 247} 248