1*9880d681SAndroid Build Coastguard Worker; RUN: llc --march=mips64 -mcpu=mips64r2 < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Generated from the C program: 4*9880d681SAndroid Build Coastguard Worker; 5*9880d681SAndroid Build Coastguard Worker; #include <stdio.h> 6*9880d681SAndroid Build Coastguard Worker; #include <string.h> 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker; struct SmallStruct_1b1s { 9*9880d681SAndroid Build Coastguard Worker; char x1; 10*9880d681SAndroid Build Coastguard Worker; short x2; 11*9880d681SAndroid Build Coastguard Worker; }; 12*9880d681SAndroid Build Coastguard Worker; 13*9880d681SAndroid Build Coastguard Worker; struct SmallStruct_1b1i { 14*9880d681SAndroid Build Coastguard Worker; char x1; 15*9880d681SAndroid Build Coastguard Worker; int x2; 16*9880d681SAndroid Build Coastguard Worker; }; 17*9880d681SAndroid Build Coastguard Worker; 18*9880d681SAndroid Build Coastguard Worker; struct SmallStruct_1b1s1b { 19*9880d681SAndroid Build Coastguard Worker; char x1; 20*9880d681SAndroid Build Coastguard Worker; short x2; 21*9880d681SAndroid Build Coastguard Worker; char x3; 22*9880d681SAndroid Build Coastguard Worker; }; 23*9880d681SAndroid Build Coastguard Worker; 24*9880d681SAndroid Build Coastguard Worker; struct SmallStruct_1s1i { 25*9880d681SAndroid Build Coastguard Worker; short x1; 26*9880d681SAndroid Build Coastguard Worker; int x2; 27*9880d681SAndroid Build Coastguard Worker; }; 28*9880d681SAndroid Build Coastguard Worker; 29*9880d681SAndroid Build Coastguard Worker; struct SmallStruct_3b1s { 30*9880d681SAndroid Build Coastguard Worker; char x1; 31*9880d681SAndroid Build Coastguard Worker; char x2; 32*9880d681SAndroid Build Coastguard Worker; char x3; 33*9880d681SAndroid Build Coastguard Worker; short x4; 34*9880d681SAndroid Build Coastguard Worker; }; 35*9880d681SAndroid Build Coastguard Worker; 36*9880d681SAndroid Build Coastguard Worker; void varArgF_SmallStruct(char* c, ...); 37*9880d681SAndroid Build Coastguard Worker; 38*9880d681SAndroid Build Coastguard Worker; void smallStruct_1b1s(struct SmallStruct_1b1s* ss) 39*9880d681SAndroid Build Coastguard Worker; { 40*9880d681SAndroid Build Coastguard Worker; varArgF_SmallStruct("", *ss); 41*9880d681SAndroid Build Coastguard Worker; } 42*9880d681SAndroid Build Coastguard Worker; 43*9880d681SAndroid Build Coastguard Worker; void smallStruct_1b1i(struct SmallStruct_1b1i* ss) 44*9880d681SAndroid Build Coastguard Worker; { 45*9880d681SAndroid Build Coastguard Worker; varArgF_SmallStruct("", *ss); 46*9880d681SAndroid Build Coastguard Worker; } 47*9880d681SAndroid Build Coastguard Worker; 48*9880d681SAndroid Build Coastguard Worker; void smallStruct_1b1s1b(struct SmallStruct_1b1s1b* ss) 49*9880d681SAndroid Build Coastguard Worker; { 50*9880d681SAndroid Build Coastguard Worker; varArgF_SmallStruct("", *ss); 51*9880d681SAndroid Build Coastguard Worker; } 52*9880d681SAndroid Build Coastguard Worker; 53*9880d681SAndroid Build Coastguard Worker; void smallStruct_1s1i(struct SmallStruct_1s1i* ss) 54*9880d681SAndroid Build Coastguard Worker; { 55*9880d681SAndroid Build Coastguard Worker; varArgF_SmallStruct("", *ss); 56*9880d681SAndroid Build Coastguard Worker; } 57*9880d681SAndroid Build Coastguard Worker; 58*9880d681SAndroid Build Coastguard Worker; void smallStruct_3b1s(struct SmallStruct_3b1s* ss) 59*9880d681SAndroid Build Coastguard Worker; { 60*9880d681SAndroid Build Coastguard Worker; varArgF_SmallStruct("", *ss); 61*9880d681SAndroid Build Coastguard Worker; } 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker%struct.SmallStruct_1b1s = type { i8, i16 } 64*9880d681SAndroid Build Coastguard Worker%struct.SmallStruct_1b1i = type { i8, i32 } 65*9880d681SAndroid Build Coastguard Worker%struct.SmallStruct_1b1s1b = type { i8, i16, i8 } 66*9880d681SAndroid Build Coastguard Worker%struct.SmallStruct_1s1i = type { i16, i32 } 67*9880d681SAndroid Build Coastguard Worker%struct.SmallStruct_3b1s = type { i8, i8, i8, i16 } 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker@.str = private unnamed_addr constant [3 x i8] c"01\00", align 1 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdeclare void @varArgF_SmallStruct(i8* %c, ...) 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine void @smallStruct_1b1s(%struct.SmallStruct_1b1s* %ss) #0 { 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker %ss.addr = alloca %struct.SmallStruct_1b1s*, align 8 76*9880d681SAndroid Build Coastguard Worker store %struct.SmallStruct_1b1s* %ss, %struct.SmallStruct_1b1s** %ss.addr, align 8 77*9880d681SAndroid Build Coastguard Worker %0 = load %struct.SmallStruct_1b1s*, %struct.SmallStruct_1b1s** %ss.addr, align 8 78*9880d681SAndroid Build Coastguard Worker %1 = bitcast %struct.SmallStruct_1b1s* %0 to { i32 }* 79*9880d681SAndroid Build Coastguard Worker %2 = getelementptr { i32 }, { i32 }* %1, i32 0, i32 0 80*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32* %2, align 1 81*9880d681SAndroid Build Coastguard Worker call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i32 inreg %3) 82*9880d681SAndroid Build Coastguard Worker ret void 83*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: smallStruct_1b1s: 84*9880d681SAndroid Build Coastguard Worker ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 32 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine void @smallStruct_1b1i(%struct.SmallStruct_1b1i* %ss) #0 { 88*9880d681SAndroid Build Coastguard Workerentry: 89*9880d681SAndroid Build Coastguard Worker %ss.addr = alloca %struct.SmallStruct_1b1i*, align 8 90*9880d681SAndroid Build Coastguard Worker store %struct.SmallStruct_1b1i* %ss, %struct.SmallStruct_1b1i** %ss.addr, align 8 91*9880d681SAndroid Build Coastguard Worker %0 = load %struct.SmallStruct_1b1i*, %struct.SmallStruct_1b1i** %ss.addr, align 8 92*9880d681SAndroid Build Coastguard Worker %1 = bitcast %struct.SmallStruct_1b1i* %0 to { i64 }* 93*9880d681SAndroid Build Coastguard Worker %2 = getelementptr { i64 }, { i64 }* %1, i32 0, i32 0 94*9880d681SAndroid Build Coastguard Worker %3 = load i64, i64* %2, align 1 95*9880d681SAndroid Build Coastguard Worker call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 inreg %3) 96*9880d681SAndroid Build Coastguard Worker ret void 97*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: smallStruct_1b1i: 98*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: dsll 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine void @smallStruct_1b1s1b(%struct.SmallStruct_1b1s1b* %ss) #0 { 102*9880d681SAndroid Build Coastguard Workerentry: 103*9880d681SAndroid Build Coastguard Worker %ss.addr = alloca %struct.SmallStruct_1b1s1b*, align 8 104*9880d681SAndroid Build Coastguard Worker %.coerce = alloca { i48 } 105*9880d681SAndroid Build Coastguard Worker store %struct.SmallStruct_1b1s1b* %ss, %struct.SmallStruct_1b1s1b** %ss.addr, align 8 106*9880d681SAndroid Build Coastguard Worker %0 = load %struct.SmallStruct_1b1s1b*, %struct.SmallStruct_1b1s1b** %ss.addr, align 8 107*9880d681SAndroid Build Coastguard Worker %1 = bitcast { i48 }* %.coerce to i8* 108*9880d681SAndroid Build Coastguard Worker %2 = bitcast %struct.SmallStruct_1b1s1b* %0 to i8* 109*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 6, i32 0, i1 false) 110*9880d681SAndroid Build Coastguard Worker %3 = getelementptr { i48 }, { i48 }* %.coerce, i32 0, i32 0 111*9880d681SAndroid Build Coastguard Worker %4 = load i48, i48* %3, align 1 112*9880d681SAndroid Build Coastguard Worker call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i48 inreg %4) 113*9880d681SAndroid Build Coastguard Worker ret void 114*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: smallStruct_1b1s1b: 115*9880d681SAndroid Build Coastguard Worker ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 16 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #1 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine void @smallStruct_1s1i(%struct.SmallStruct_1s1i* %ss) #0 { 121*9880d681SAndroid Build Coastguard Workerentry: 122*9880d681SAndroid Build Coastguard Worker %ss.addr = alloca %struct.SmallStruct_1s1i*, align 8 123*9880d681SAndroid Build Coastguard Worker store %struct.SmallStruct_1s1i* %ss, %struct.SmallStruct_1s1i** %ss.addr, align 8 124*9880d681SAndroid Build Coastguard Worker %0 = load %struct.SmallStruct_1s1i*, %struct.SmallStruct_1s1i** %ss.addr, align 8 125*9880d681SAndroid Build Coastguard Worker %1 = bitcast %struct.SmallStruct_1s1i* %0 to { i64 }* 126*9880d681SAndroid Build Coastguard Worker %2 = getelementptr { i64 }, { i64 }* %1, i32 0, i32 0 127*9880d681SAndroid Build Coastguard Worker %3 = load i64, i64* %2, align 1 128*9880d681SAndroid Build Coastguard Worker call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 inreg %3) 129*9880d681SAndroid Build Coastguard Worker ret void 130*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: smallStruct_1s1i: 131*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: dsll 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine void @smallStruct_3b1s(%struct.SmallStruct_3b1s* %ss) #0 { 135*9880d681SAndroid Build Coastguard Workerentry: 136*9880d681SAndroid Build Coastguard Worker %ss.addr = alloca %struct.SmallStruct_3b1s*, align 8 137*9880d681SAndroid Build Coastguard Worker %.coerce = alloca { i48 } 138*9880d681SAndroid Build Coastguard Worker store %struct.SmallStruct_3b1s* %ss, %struct.SmallStruct_3b1s** %ss.addr, align 8 139*9880d681SAndroid Build Coastguard Worker %0 = load %struct.SmallStruct_3b1s*, %struct.SmallStruct_3b1s** %ss.addr, align 8 140*9880d681SAndroid Build Coastguard Worker %1 = bitcast { i48 }* %.coerce to i8* 141*9880d681SAndroid Build Coastguard Worker %2 = bitcast %struct.SmallStruct_3b1s* %0 to i8* 142*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 6, i32 0, i1 false) 143*9880d681SAndroid Build Coastguard Worker %3 = getelementptr { i48 }, { i48 }* %.coerce, i32 0, i32 0 144*9880d681SAndroid Build Coastguard Worker %4 = load i48, i48* %3, align 1 145*9880d681SAndroid Build Coastguard Worker call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i48 inreg %4) 146*9880d681SAndroid Build Coastguard Worker ret void 147*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: smallStruct_3b1s: 148*9880d681SAndroid Build Coastguard Worker ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 16 149*9880d681SAndroid Build Coastguard Worker} 150