Home | History | Annotate | Download | only in libbcc
      1 ; This checks that RSForEachExpand generates getelementptr
      2 ; instructions into the driver info structure as expected - namely,
      3 ; that they index into the right positions of the structure and that
      4 ; the instructions that are generated are in the loop header.
      5 
      6 ; RUN: opt -load libbcc.so -kernelexp -S < %s | FileCheck %s
      7 
      8 ; ModuleID = 'test_getelementptr.bc'
      9 target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
     10 target triple = "aarch64-none-linux-gnueabi"
     11 
     12 ; Declarations expected by the expansion pass.
     13 declare void @_Z14rsGetElementAt13rs_allocationj()
     14 declare void @_Z14rsGetElementAt13rs_allocationjj()
     15 declare void @_Z14rsGetElementAt13rs_allocationjjj()
     16 declare void @_Z14rsSetElementAt13rs_allocationPvj()
     17 declare void @_Z14rsSetElementAt13rs_allocationPvjj()
     18 declare void @_Z14rsSetElementAt13rs_allocationPvjjj()
     19 declare void @_Z25rsGetElementAtYuv_uchar_Y13rs_allocationjj()
     20 declare void @_Z25rsGetElementAtYuv_uchar_U13rs_allocationjj()
     21 declare void @_Z25rsGetElementAtYuv_uchar_V13rs_allocationjj()
     22 
     23 ; Old-style kernel
     24 define void @root(i32* nocapture %ain, i32* nocapture %out, i32 %x, i32 %y, i32 %z) {
     25   ret void
     26 ; CHECK: define void @root.expand(%RsExpandKernelDriverInfoPfx* %p, i32 %x1, i32 %x2, i32 %outstep)
     27 ; CHECK: Begin:
     28 ; CHECK: %instep_addr.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 1, i32 0
     29 ; CHECK: load i32, i32* %instep_addr.gep
     30 ; CHECK: %input_buf.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 0, i32 0
     31 ; CHECK: load i8*, i8** %input_buf.gep
     32 ; CHECK: %out_buf.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 3, i32 0
     33 ; CHECK: load i8*, i8** %out_buf.gep
     34 ; CHECK: %Y.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 7, i32 1
     35 ; CHECK: load i32, i32* %Y.gep
     36 ; CHECK: %Z.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 7, i32 2
     37 ; CHECK: load i32, i32* %Z.gep
     38 ; CHECK: Loop:
     39 }
     40 
     41 ; New style kernel with multiple inputs
     42 define i32 @foo(i32 %in0, i32 %in1, i32 %x, i32 %y, i32 %z) {
     43   ret i32 0
     44 ; CHECK: define void @foo.expand(%RsExpandKernelDriverInfoPfx* %p, i32 %x1, i32 %x2, i32 %arg_outstep)
     45 ; CHECK: Begin:
     46 ; CHECK: %out_buf.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 3, i32 0
     47 ; CHECK: load i8*, i8** %out_buf.gep
     48 ; CHECK: %Y.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 7, i32 1
     49 ; CHECK: load i32, i32* %Y.gep
     50 ; CHECK: %Z.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 7, i32 2
     51 ; CHECK: load i32, i32* %Z.gep
     52 ; CHECK: %input_buf.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 0, i32 0
     53 ; CHECK: load i8*, i8** %input_buf.gep
     54 ; CHECK: %input_buf.gep1 = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 0, i32 1
     55 ; CHECK: load i8*, i8** %input_buf.gep1
     56 ; CHECK: Loop:
     57 }
     58 
     59 !llvm.ident = !{!0}
     60 !\23pragma = !{!1, !2}
     61 !\23rs_export_foreach_name = !{!3, !4}
     62 !\23rs_export_foreach = !{!5, !6}
     63 
     64 !0 = !{!"clang version 3.6 "}
     65 !1 = !{!"version", !"1"}
     66 !2 = !{!"java_package_name", !"foo"}
     67 !3 = !{!"root"}
     68 !4 = !{!"foo"}
     69 !5 = !{!"91"}
     70 !6 = !{!"123"}
     71