r271336 - [CUDA] Conservatively mark inline asm as convergent.

Tom Stellard via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 1 11:22:39 PDT 2016


On Tue, May 31, 2016 at 09:27:13PM -0000, Justin Lebar via cfe-commits wrote:
> Author: jlebar
> Date: Tue May 31 16:27:13 2016
> New Revision: 271336
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=271336&view=rev
> Log:
> [CUDA] Conservatively mark inline asm as convergent.
> 
> Summary:
> This is particularly important because a some convergent CUDA intrinsics
> (e.g.  __shfl_down) are implemented in terms of inline asm.
> 

Hi,

The MachineInstr INLINEASM also needs to be marked as convergent,
otherwise you will run into the same problem with the
MachineInstr passes.

-Tom

> Reviewers: tra
> 
> Subscribers: cfe-commits
> 
> Differential Revision: http://reviews.llvm.org/D20836
> 
> Modified:
>     cfe/trunk/lib/CodeGen/CGStmt.cpp
>     cfe/trunk/test/CodeGenCUDA/convergent.cu
> 
> Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=271336&r1=271335&r2=271336&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Tue May 31 16:27:13 2016
> @@ -2054,6 +2054,14 @@ void CodeGenFunction::EmitAsmStmt(const
>                                            llvm::ConstantAsMetadata::get(Loc)));
>    }
>  
> +  if (getLangOpts().CUDA && getLangOpts().CUDAIsDevice) {
> +    // Conservatively, mark all inline asm blocks in CUDA as convergent
> +    // (meaning, they may call an intrinsically convergent op, such as bar.sync,
> +    // and so can't have certain optimizations applied around them).
> +    Result->addAttribute(llvm::AttributeSet::FunctionIndex,
> +                         llvm::Attribute::Convergent);
> +  }
> +
>    // Extract all of the register value results from the asm.
>    std::vector<llvm::Value*> RegResults;
>    if (ResultRegTypes.size() == 1) {
> 
> Modified: cfe/trunk/test/CodeGenCUDA/convergent.cu
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCUDA/convergent.cu?rev=271336&r1=271335&r2=271336&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCUDA/convergent.cu (original)
> +++ cfe/trunk/test/CodeGenCUDA/convergent.cu Tue May 31 16:27:13 2016
> @@ -25,6 +25,11 @@ __host__ __device__ void baz();
>  __host__ __device__ void bar() {
>    // DEVICE: call void @_Z3bazv() [[CALL_ATTR:#[0-9]+]]
>    baz();
> +  // DEVICE: call i32 asm "trap;", "=l"() [[ASM_ATTR:#[0-9]+]]
> +  int x;
> +  asm ("trap;" : "=l"(x));
> +  // DEVICE: call void asm sideeffect "trap;", ""() [[ASM_ATTR:#[0-9]+]]
> +  asm volatile ("trap;");
>  }
>  
>  // DEVICE: declare void @_Z3bazv() [[BAZ_ATTR:#[0-9]+]]
> @@ -32,6 +37,7 @@ __host__ __device__ void bar() {
>  // DEVICE-SAME: convergent
>  // DEVICE-SAME: }
>  // DEVICE: attributes [[CALL_ATTR]] = { convergent }
> +// DEVICE: attributes [[ASM_ATTR]] = { convergent
>  
>  // HOST: declare void @_Z3bazv() [[BAZ_ATTR:#[0-9]+]]
>  // HOST: attributes [[BAZ_ATTR]] = {
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list