diff --git a/ctx.cpp b/ctx.cpp index 3c972f1c..43d5771b 100644 --- a/ctx.cpp +++ b/ctx.cpp @@ -3684,29 +3684,43 @@ FunctionEmitContext::LaunchInst(llvm::Value *callee, void FunctionEmitContext::SyncInst() { - llvm::Value *launchGroupHandle = LoadInst(launchGroupHandlePtr); - llvm::Value *nullPtrValue = - llvm::Constant::getNullValue(LLVMTypes::VoidPointerType); - llvm::Value *nonNull = CmpInst(llvm::Instruction::ICmp, - llvm::CmpInst::ICMP_NE, - launchGroupHandle, nullPtrValue); - llvm::BasicBlock *bSync = CreateBasicBlock("call_sync"); - llvm::BasicBlock *bPostSync = CreateBasicBlock("post_sync"); - BranchInst(bSync, bPostSync, nonNull); + if (g->target->getISA() != Target::NVPTX) + { + llvm::Value *launchGroupHandle = LoadInst(launchGroupHandlePtr); + llvm::Value *nullPtrValue = + llvm::Constant::getNullValue(LLVMTypes::VoidPointerType); + llvm::Value *nonNull = CmpInst(llvm::Instruction::ICmp, + llvm::CmpInst::ICMP_NE, + launchGroupHandle, nullPtrValue); + llvm::BasicBlock *bSync = CreateBasicBlock("call_sync"); + llvm::BasicBlock *bPostSync = CreateBasicBlock("post_sync"); + BranchInst(bSync, bPostSync, nonNull); - SetCurrentBasicBlock(bSync); - llvm::Function *fsync = m->module->getFunction("ISPCSync"); - if (fsync == NULL) - FATAL("Couldn't find ISPCSync declaration?!"); - CallInst(fsync, NULL, launchGroupHandle, ""); + SetCurrentBasicBlock(bSync); + llvm::Function *fsync = m->module->getFunction("ISPCSync"); + if (fsync == NULL) + FATAL("Couldn't find ISPCSync declaration?!"); + CallInst(fsync, NULL, launchGroupHandle, ""); - // zero out the handle so that if ISPCLaunch is called again in this - // function, it knows it's starting out from scratch - StoreInst(nullPtrValue, launchGroupHandlePtr); + // zero out the handle so that if ISPCLaunch is called again in this + // function, it knows it's starting out from scratch + StoreInst(nullPtrValue, launchGroupHandlePtr); - BranchInst(bPostSync); + BranchInst(bPostSync); - SetCurrentBasicBlock(bPostSync); + SetCurrentBasicBlock(bPostSync); + } + else /* NVPTX: don't do test, just call sync */ + { + llvm::Value *launchGroupHandle = LoadInst(launchGroupHandlePtr); + llvm::Value *nullPtrValue = + llvm::Constant::getNullValue(LLVMTypes::VoidPointerType); + llvm::Function *fsync = m->module->getFunction("ISPCSync"); + if (fsync == NULL) + FATAL("Couldn't find ISPCSync declaration?!"); + CallInst(fsync, NULL, launchGroupHandle, ""); + StoreInst(nullPtrValue, launchGroupHandlePtr); + } } diff --git a/decl.cpp b/decl.cpp index 52848fbf..7b321dde 100644 --- a/decl.cpp +++ b/decl.cpp @@ -531,9 +531,11 @@ Declarator::InitFromType(const Type *baseType, DeclSpecs *ds) { returnType = returnType->ResolveUnboundVariability(Variability::Varying); bool isTask = ds && ((ds->typeQualifiers & TYPEQUAL_TASK) != 0); - /* evghenii: without this, PTX fails on some examples, like deferred */ + +#if 1 /* evghenii: without this, PTX fails on some examples, like deferred, with #if 0 */ if (isTask && g->target->getISA() == Target::NVPTX) ds->typeQualifiers |= TYPEQUAL_UNMASKED; +#endif bool isExternC = ds && (ds->storageClass == SC_EXTERN_C); bool isExported = ds && ((ds->typeQualifiers & TYPEQUAL_EXPORT) != 0);