; This checks that RSForEachExpand generates getelementptr ; instructions into the driver info structure as expected - namely, ; that they index into the right positions of the structure and that ; the instructions that are generated are in the loop header. ; RUN: opt -load libbcc.so -kernelexp -S < %s | FileCheck %s ; ModuleID = 'test_getelementptr.bc' target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128" target triple = "aarch64-none-linux-gnueabi" ; Declarations expected by the expansion pass. declare void @_Z14rsGetElementAt13rs_allocationj() declare void @_Z14rsGetElementAt13rs_allocationjj() declare void @_Z14rsGetElementAt13rs_allocationjjj() declare void @_Z14rsSetElementAt13rs_allocationPvj() declare void @_Z14rsSetElementAt13rs_allocationPvjj() declare void @_Z14rsSetElementAt13rs_allocationPvjjj() declare void @_Z25rsGetElementAtYuv_uchar_Y13rs_allocationjj() declare void @_Z25rsGetElementAtYuv_uchar_U13rs_allocationjj() declare void @_Z25rsGetElementAtYuv_uchar_V13rs_allocationjj() ; Old-style kernel define void @root(i32* nocapture %ain, i32* nocapture %out, i32 %x, i32 %y, i32 %z) { ret void ; CHECK: define void @root.expand(%RsExpandKernelDriverInfoPfx* %p, i32 %x1, i32 %x2, i32 %outstep) ; CHECK: Begin: ; CHECK: %instep_addr.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 1, i32 0 ; CHECK: load i32, i32* %instep_addr.gep ; CHECK: %input_buf.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 0, i32 0 ; CHECK: load i8*, i8** %input_buf.gep ; CHECK: %out_buf.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 3, i32 0 ; CHECK: load i8*, i8** %out_buf.gep ; CHECK: %Y.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 7, i32 1 ; CHECK: load i32, i32* %Y.gep ; CHECK: %Z.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 7, i32 2 ; CHECK: load i32, i32* %Z.gep ; CHECK: Loop: } ; New style kernel with multiple inputs define i32 @foo(i32 %in0, i32 %in1, i32 %x, i32 %y, i32 %z) { ret i32 0 ; CHECK: define void @foo.expand(%RsExpandKernelDriverInfoPfx* %p, i32 %x1, i32 %x2, i32 %arg_outstep) ; CHECK: Begin: ; CHECK: %out_buf.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 3, i32 0 ; CHECK: load i8*, i8** %out_buf.gep ; CHECK: %Y.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 7, i32 1 ; CHECK: load i32, i32* %Y.gep ; CHECK: %Z.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 7, i32 2 ; CHECK: load i32, i32* %Z.gep ; CHECK: %input_buf.gep = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 0, i32 0 ; CHECK: load i8*, i8** %input_buf.gep ; CHECK: %input_buf.gep1 = getelementptr inbounds %RsExpandKernelDriverInfoPfx, %RsExpandKernelDriverInfoPfx* %p, i32 0, i32 0, i32 1 ; CHECK: load i8*, i8** %input_buf.gep1 ; CHECK: Loop: } !llvm.ident = !{!0} !\23pragma = !{!1, !2} !\23rs_export_foreach_name = !{!3, !4} !\23rs_export_foreach = !{!5, !6} ; The following named metadata would not be present in a bitcode file, ; but instead synthesized by bcc from the bitcode wrapper. However, ; for this test case, we're not running bcc, but instead opt, and so ; we never get the opportunity to synthesize this named metadata. !\23rs_wrapper = !{!7} !0 = !{!"clang version 3.6 "} !1 = !{!"version", !"1"} !2 = !{!"java_package_name", !"foo"} !3 = !{!"root"} !4 = !{!"foo"} !5 = !{!"91"} !6 = !{!"123"} !7 = !{!"0", !"3"}