================ @@ -2276,6 +2276,29 @@ void CodeGenFunction::EmitSwitchStmt(const SwitchStmt &S) { // failure. llvm::BasicBlock *DefaultBlock = createBasicBlock("sw.default"); SwitchInsn = Builder.CreateSwitch(CondV, DefaultBlock); + switch (HLSLControlFlowAttr) { + case HLSLControlFlowHintAttr::Microsoft_branch: + case HLSLControlFlowHintAttr::Microsoft_flatten: { + llvm::MDBuilder MDHelper(CGM.getLLVMContext()); + + llvm::ConstantInt *BranchHintConstant = + HLSLControlFlowAttr == + HLSLControlFlowHintAttr::Spelling::Microsoft_branch + ? llvm::ConstantInt::get(CGM.Int32Ty, 1) + : llvm::ConstantInt::get(CGM.Int32Ty, 2); + + SmallVector<llvm::Metadata *, 2> Vals( + {MDHelper.createString("hlsl.controlflow.hint"), + MDHelper.createConstant(BranchHintConstant)}); + SwitchInsn->setMetadata("hlsl.controlflow.hint", + llvm::MDNode::get(CGM.getLLVMContext(), Vals)); + break; + } + // This is required to avoid warnings during compilation + case HLSLControlFlowHintAttr::SpellingNotCalculated: + break; + } + ---------------- llvm-beanz wrote:
It is weird to have a switch statement that then needs what is effectively an if/select over the same condition as the switch. It looks like what you're really doing here is checking if the attribute has an appropriate value then setting the hint. Something more like: ```suggestion if(HLSLControlFlowAttr != HLSLControlFlowHintAttr::SpellingNotCalculated) { llvm::MDBuilder MDHelper(CGM.getLLVMContext()); llvm::ConstantInt *BranchHintConstant = HLSLControlFlowAttr == HLSLControlFlowHintAttr::Spelling::Microsoft_branch ? llvm::ConstantInt::get(CGM.Int32Ty, 1) : llvm::ConstantInt::get(CGM.Int32Ty, 2); llvm::Metadata * Vals[] = {MDHelper.createString("hlsl.controlflow.hint"), MDHelper.createConstant(BranchHintConstant)}); SwitchInsn->setMetadata("hlsl.controlflow.hint", llvm::MDNode::get(CGM.getLLVMContext(), Vals)); } ``` Also note the replacement of the SmallVector with a static array. llvm::MDNode::get takes an ArrayRef which can be constructed from a static array which is more efficient than constructing it from a SmallVector. https://github.com/llvm/llvm-project/pull/131739 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits