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