1; RUN: llc --march=mips64 -mcpu=mips64r2 < %s | FileCheck %s 2 3; Generated from the C program: 4; 5; #include <stdio.h> 6; #include <string.h> 7; 8; struct SmallStruct_1b { 9; char x1; 10; }; 11; 12; struct SmallStruct_2b { 13; char x1; 14; char x2; 15; }; 16; 17; struct SmallStruct_3b { 18; char x1; 19; char x2; 20; char x3; 21; }; 22; 23; struct SmallStruct_4b { 24; char x1; 25; char x2; 26; char x3; 27; char x4; 28; }; 29; 30; struct SmallStruct_5b { 31; char x1; 32; char x2; 33; char x3; 34; char x4; 35; char x5; 36; }; 37; 38; struct SmallStruct_6b { 39; char x1; 40; char x2; 41; char x3; 42; char x4; 43; char x5; 44; char x6; 45; }; 46; 47; struct SmallStruct_7b { 48; char x1; 49; char x2; 50; char x3; 51; char x4; 52; char x5; 53; char x6; 54; char x7; 55; }; 56; 57; struct SmallStruct_8b { 58; char x1; 59; char x2; 60; char x3; 61; char x4; 62; char x5; 63; char x6; 64; char x7; 65; char x8; 66; }; 67; 68; struct SmallStruct_9b { 69; char x1; 70; char x2; 71; char x3; 72; char x4; 73; char x5; 74; char x6; 75; char x7; 76; char x8; 77; char x9; 78; }; 79; 80; void varArgF_SmallStruct(char* c, ...); 81; 82; void smallStruct_1b(struct SmallStruct_1b* ss) { 83; varArgF_SmallStruct("", *ss); 84; } 85; 86; void smallStruct_2b(struct SmallStruct_2b* ss) { 87; varArgF_SmallStruct("", *ss); 88; } 89; 90; void smallStruct_3b(struct SmallStruct_3b* ss) 91; { 92; varArgF_SmallStruct("", *ss); 93; } 94; 95; void smallStruct_4b(struct SmallStruct_4b* ss) 96; { 97; varArgF_SmallStruct("", *ss); 98; } 99; 100; void smallStruct_5b(struct SmallStruct_5b* ss) 101; { 102; varArgF_SmallStruct("", *ss); 103; } 104; 105; void smallStruct_6b(struct SmallStruct_6b* ss) 106; { 107; varArgF_SmallStruct("", *ss); 108; } 109; 110; void smallStruct_7b(struct SmallStruct_7b* ss) 111; { 112; varArgF_SmallStruct("", *ss); 113; } 114; 115; void smallStruct_8b(struct SmallStruct_8b* ss) 116; { 117; varArgF_SmallStruct("", *ss); 118; } 119; 120; void smallStruct_9b(struct SmallStruct_9b* ss) 121; { 122; varArgF_SmallStruct("", *ss); 123; } 124 125%struct.SmallStruct_1b = type { i8 } 126%struct.SmallStruct_2b = type { i8, i8 } 127%struct.SmallStruct_3b = type { i8, i8, i8 } 128%struct.SmallStruct_4b = type { i8, i8, i8, i8 } 129%struct.SmallStruct_5b = type { i8, i8, i8, i8, i8 } 130%struct.SmallStruct_6b = type { i8, i8, i8, i8, i8, i8 } 131%struct.SmallStruct_7b = type { i8, i8, i8, i8, i8, i8, i8 } 132%struct.SmallStruct_8b = type { i8, i8, i8, i8, i8, i8, i8, i8 } 133%struct.SmallStruct_9b = type { i8, i8, i8, i8, i8, i8, i8, i8, i8 } 134 135@.str = private unnamed_addr constant [3 x i8] c"01\00", align 1 136 137declare void @varArgF_SmallStruct(i8* %c, ...) 138 139define void @smallStruct_1b(%struct.SmallStruct_1b* %ss) #0 { 140entry: 141 %ss.addr = alloca %struct.SmallStruct_1b*, align 8 142 store %struct.SmallStruct_1b* %ss, %struct.SmallStruct_1b** %ss.addr, align 8 143 %0 = load %struct.SmallStruct_1b*, %struct.SmallStruct_1b** %ss.addr, align 8 144 %1 = bitcast %struct.SmallStruct_1b* %0 to { i8 }* 145 %2 = getelementptr { i8 }, { i8 }* %1, i32 0, i32 0 146 %3 = load i8, i8* %2, align 1 147 call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i8 inreg %3) 148 ret void 149 ; CHECK-LABEL: smallStruct_1b: 150 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 56 151} 152 153define void @smallStruct_2b(%struct.SmallStruct_2b* %ss) #0 { 154entry: 155 %ss.addr = alloca %struct.SmallStruct_2b*, align 8 156 store %struct.SmallStruct_2b* %ss, %struct.SmallStruct_2b** %ss.addr, align 8 157 %0 = load %struct.SmallStruct_2b*, %struct.SmallStruct_2b** %ss.addr, align 8 158 %1 = bitcast %struct.SmallStruct_2b* %0 to { i16 }* 159 %2 = getelementptr { i16 }, { i16 }* %1, i32 0, i32 0 160 %3 = load i16, i16* %2, align 1 161 call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i16 inreg %3) 162 ret void 163 ; CHECK-LABEL: smallStruct_2b: 164 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 48 165} 166 167define void @smallStruct_3b(%struct.SmallStruct_3b* %ss) #0 { 168entry: 169 %ss.addr = alloca %struct.SmallStruct_3b*, align 8 170 %.coerce = alloca { i24 } 171 store %struct.SmallStruct_3b* %ss, %struct.SmallStruct_3b** %ss.addr, align 8 172 %0 = load %struct.SmallStruct_3b*, %struct.SmallStruct_3b** %ss.addr, align 8 173 %1 = bitcast { i24 }* %.coerce to i8* 174 %2 = bitcast %struct.SmallStruct_3b* %0 to i8* 175 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 3, i32 0, i1 false) 176 %3 = getelementptr { i24 }, { i24 }* %.coerce, i32 0, i32 0 177 %4 = load i24, i24* %3, align 1 178 call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i24 inreg %4) 179 ret void 180 ; CHECK-LABEL: smallStruct_3b: 181 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 40 182} 183 184declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #1 185 186define void @smallStruct_4b(%struct.SmallStruct_4b* %ss) #0 { 187entry: 188 %ss.addr = alloca %struct.SmallStruct_4b*, align 8 189 store %struct.SmallStruct_4b* %ss, %struct.SmallStruct_4b** %ss.addr, align 8 190 %0 = load %struct.SmallStruct_4b*, %struct.SmallStruct_4b** %ss.addr, align 8 191 %1 = bitcast %struct.SmallStruct_4b* %0 to { i32 }* 192 %2 = getelementptr { i32 }, { i32 }* %1, i32 0, i32 0 193 %3 = load i32, i32* %2, align 1 194 call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i32 inreg %3) 195 ret void 196 ; CHECK-LABEL: smallStruct_4b: 197 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 32 198} 199 200define void @smallStruct_5b(%struct.SmallStruct_5b* %ss) #0 { 201entry: 202 %ss.addr = alloca %struct.SmallStruct_5b*, align 8 203 %.coerce = alloca { i40 } 204 store %struct.SmallStruct_5b* %ss, %struct.SmallStruct_5b** %ss.addr, align 8 205 %0 = load %struct.SmallStruct_5b*, %struct.SmallStruct_5b** %ss.addr, align 8 206 %1 = bitcast { i40 }* %.coerce to i8* 207 %2 = bitcast %struct.SmallStruct_5b* %0 to i8* 208 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 5, i32 0, i1 false) 209 %3 = getelementptr { i40 }, { i40 }* %.coerce, i32 0, i32 0 210 %4 = load i40, i40* %3, align 1 211 call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i40 inreg %4) 212 ret void 213 ; CHECK-LABEL: smallStruct_5b: 214 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 24 215} 216 217define void @smallStruct_6b(%struct.SmallStruct_6b* %ss) #0 { 218entry: 219 %ss.addr = alloca %struct.SmallStruct_6b*, align 8 220 %.coerce = alloca { i48 } 221 store %struct.SmallStruct_6b* %ss, %struct.SmallStruct_6b** %ss.addr, align 8 222 %0 = load %struct.SmallStruct_6b*, %struct.SmallStruct_6b** %ss.addr, align 8 223 %1 = bitcast { i48 }* %.coerce to i8* 224 %2 = bitcast %struct.SmallStruct_6b* %0 to i8* 225 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 6, i32 0, i1 false) 226 %3 = getelementptr { i48 }, { i48 }* %.coerce, i32 0, i32 0 227 %4 = load i48, i48* %3, align 1 228 call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i48 inreg %4) 229 ret void 230 ; CHECK-LABEL: smallStruct_6b: 231 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 16 232} 233 234define void @smallStruct_7b(%struct.SmallStruct_7b* %ss) #0 { 235entry: 236 %ss.addr = alloca %struct.SmallStruct_7b*, align 8 237 %.coerce = alloca { i56 } 238 store %struct.SmallStruct_7b* %ss, %struct.SmallStruct_7b** %ss.addr, align 8 239 %0 = load %struct.SmallStruct_7b*, %struct.SmallStruct_7b** %ss.addr, align 8 240 %1 = bitcast { i56 }* %.coerce to i8* 241 %2 = bitcast %struct.SmallStruct_7b* %0 to i8* 242 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 7, i32 0, i1 false) 243 %3 = getelementptr { i56 }, { i56 }* %.coerce, i32 0, i32 0 244 %4 = load i56, i56* %3, align 1 245 call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i56 inreg %4) 246 ret void 247 ; CHECK-LABEL: smallStruct_7b: 248 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 8 249} 250 251define void @smallStruct_8b(%struct.SmallStruct_8b* %ss) #0 { 252entry: 253 %ss.addr = alloca %struct.SmallStruct_8b*, align 8 254 store %struct.SmallStruct_8b* %ss, %struct.SmallStruct_8b** %ss.addr, align 8 255 %0 = load %struct.SmallStruct_8b*, %struct.SmallStruct_8b** %ss.addr, align 8 256 %1 = bitcast %struct.SmallStruct_8b* %0 to { i64 }* 257 %2 = getelementptr { i64 }, { i64 }* %1, i32 0, i32 0 258 %3 = load i64, i64* %2, align 1 259 call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 inreg %3) 260 ret void 261 ; CHECK-LABEL: smallStruct_8b: 262 ; CHECK-NOT: dsll 263} 264 265define void @smallStruct_9b(%struct.SmallStruct_9b* %ss) #0 { 266entry: 267 %ss.addr = alloca %struct.SmallStruct_9b*, align 8 268 %.coerce = alloca { i64, i8 } 269 store %struct.SmallStruct_9b* %ss, %struct.SmallStruct_9b** %ss.addr, align 8 270 %0 = load %struct.SmallStruct_9b*, %struct.SmallStruct_9b** %ss.addr, align 8 271 %1 = bitcast { i64, i8 }* %.coerce to i8* 272 %2 = bitcast %struct.SmallStruct_9b* %0 to i8* 273 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 9, i32 0, i1 false) 274 %3 = getelementptr { i64, i8 }, { i64, i8 }* %.coerce, i32 0, i32 0 275 %4 = load i64, i64* %3, align 1 276 %5 = getelementptr { i64, i8 }, { i64, i8 }* %.coerce, i32 0, i32 1 277 %6 = load i8, i8* %5, align 1 278 call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 inreg %4, i8 inreg %6) 279 ret void 280 ; CHECK-LABEL: smallStruct_9b: 281 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 56 282} 283