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_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 
    137 declare void @varArgF_SmallStruct(i8* %c, ...) 
    138 
    139 define void @smallStruct_1b(%struct.SmallStruct_1b* %ss) #0 {
    140 entry:
    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 
    153 define void @smallStruct_2b(%struct.SmallStruct_2b* %ss) #0 {
    154 entry:
    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 
    167 define void @smallStruct_3b(%struct.SmallStruct_3b* %ss) #0 {
    168 entry:
    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 
    184 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #1
    185 
    186 define void @smallStruct_4b(%struct.SmallStruct_4b* %ss) #0 {
    187 entry:
    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 
    200 define void @smallStruct_5b(%struct.SmallStruct_5b* %ss) #0 {
    201 entry:
    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 
    217 define void @smallStruct_6b(%struct.SmallStruct_6b* %ss) #0 {
    218 entry:
    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 
    234 define void @smallStruct_7b(%struct.SmallStruct_7b* %ss) #0 {
    235 entry:
    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 
    251 define void @smallStruct_8b(%struct.SmallStruct_8b* %ss) #0 {
    252 entry:
    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 
    265 define void @smallStruct_9b(%struct.SmallStruct_9b* %ss) #0 {
    266 entry:
    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