Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc < %s -mtriple=armv7-apple-ios6.0 | FileCheck %s
      2 ; RUN: llc < %s -mtriple=thumbv7-apple-ios6.0 | FileCheck %s
      3 ; RUN: llc < %s -mtriple=armv7-unknown-nacl-gnueabi | FileCheck %s -check-prefix=NACL
      4 ; RUN: llc < %s -mtriple=armv5-none-linux-gnueabi | FileCheck %s -check-prefix=NOMOVT
      5 
      6 ; NOMOVT-NOT: movt
      7 
      8 ; rdar://9877866
      9 %struct.SmallStruct = type { i32, [8 x i32], [37 x i8] }
     10 %struct.LargeStruct = type { i32, [1001 x i8], [300 x i32] }
     11 
     12 define i32 @f() nounwind ssp {
     13 entry:
     14 ; CHECK-LABEL: f:
     15 ; CHECK: ldr
     16 ; CHECK: str
     17 ; CHECK-NOT:bne
     18   %st = alloca %struct.SmallStruct, align 4
     19   %call = call i32 @e1(%struct.SmallStruct* byval %st)
     20   ret i32 0
     21 }
     22 
     23 ; Generate a loop for large struct byval
     24 define i32 @g() nounwind ssp {
     25 entry:
     26 ; CHECK-LABEL: g:
     27 ; CHECK: ldr
     28 ; CHECK: sub
     29 ; CHECK: str
     30 ; CHECK: bne
     31 ; NACL-LABEL: g:
     32 ; Ensure that use movw instead of constpool for the loop trip count. But don't
     33 ; match the __stack_chk_guard movw
     34 ; NACL: movw r{{[1-9]}}, #
     35 ; NACL: ldr
     36 ; NACL: sub
     37 ; NACL: str
     38 ; NACL: bne
     39   %st = alloca %struct.LargeStruct, align 4
     40   %call = call i32 @e2(%struct.LargeStruct* byval %st)
     41   ret i32 0
     42 }
     43 
     44 ; Generate a loop using NEON instructions
     45 define i32 @h() nounwind ssp {
     46 entry:
     47 ; CHECK-LABEL: h:
     48 ; CHECK: vld1
     49 ; CHECK: sub
     50 ; CHECK: vst1
     51 ; CHECK: bne
     52 ; NACL: movw r{{[1-9]}}, #
     53 ; NACL: vld1
     54 ; NACL: sub
     55 ; NACL: vst1
     56 ; NACL: bne
     57   %st = alloca %struct.LargeStruct, align 16
     58   %call = call i32 @e3(%struct.LargeStruct* byval align 16 %st)
     59   ret i32 0
     60 }
     61 
     62 declare i32 @e1(%struct.SmallStruct* nocapture byval %in) nounwind
     63 declare i32 @e2(%struct.LargeStruct* nocapture byval %in) nounwind
     64 declare i32 @e3(%struct.LargeStruct* nocapture byval align 16 %in) nounwind
     65 
     66 ; rdar://12442472
     67 ; We can't do tail call since address of s is passed to the callee and part of
     68 ; s is in caller's local frame.
     69 define void @f3(%struct.SmallStruct* nocapture byval %s) nounwind optsize {
     70 ; CHECK-LABEL: f3
     71 ; CHECK: bl _consumestruct
     72 entry:
     73   %0 = bitcast %struct.SmallStruct* %s to i8*
     74   tail call void @consumestruct(i8* %0, i32 80) optsize
     75   ret void
     76 }
     77 
     78 define void @f4(%struct.SmallStruct* nocapture byval %s) nounwind optsize {
     79 ; CHECK-LABEL: f4
     80 ; CHECK: bl _consumestruct
     81 entry:
     82   %addr = getelementptr inbounds %struct.SmallStruct, %struct.SmallStruct* %s, i32 0, i32 0
     83   %0 = bitcast i32* %addr to i8*
     84   tail call void @consumestruct(i8* %0, i32 80) optsize
     85   ret void
     86 }
     87 
     88 ; We can do tail call here since s is in the incoming argument area.
     89 define void @f5(i32 %a, i32 %b, i32 %c, i32 %d, %struct.SmallStruct* nocapture byval %s) nounwind optsize {
     90 ; CHECK-LABEL: f5
     91 ; CHECK: b{{(\.w)?}} _consumestruct
     92 entry:
     93   %0 = bitcast %struct.SmallStruct* %s to i8*
     94   tail call void @consumestruct(i8* %0, i32 80) optsize
     95   ret void
     96 }
     97 
     98 define void @f6(i32 %a, i32 %b, i32 %c, i32 %d, %struct.SmallStruct* nocapture byval %s) nounwind optsize {
     99 ; CHECK-LABEL: f6
    100 ; CHECK: b{{(\.w)?}} _consumestruct
    101 entry:
    102   %addr = getelementptr inbounds %struct.SmallStruct, %struct.SmallStruct* %s, i32 0, i32 0
    103   %0 = bitcast i32* %addr to i8*
    104   tail call void @consumestruct(i8* %0, i32 80) optsize
    105   ret void
    106 }
    107 
    108 declare void @consumestruct(i8* nocapture %structp, i32 %structsize) nounwind
    109 
    110 ; PR17309
    111 %struct.I.8 = type { [10 x i32], [3 x i8] }
    112 
    113 declare void @use_I(%struct.I.8* byval)
    114 define void @test_I_16() {
    115 ; CHECK-LABEL: test_I_16
    116 ; CHECK: ldrb
    117 ; CHECK: strb
    118 entry:
    119   call void @use_I(%struct.I.8* byval align 16 undef)
    120   ret void
    121 }
    122