[llvm] [NVVMReflect] Force dead branch elimination in NVVMReflect (PR #81189)
Justin Lebar via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 8 13:25:52 PST 2024
================
@@ -171,13 +175,70 @@ static bool runNVVMReflect(Function &F, unsigned SmVersion) {
} else if (ReflectArg == "__CUDA_ARCH") {
ReflectVal = SmVersion * 10;
}
+
+ // If the immediate user is a simple comparison we want to simplify it.
+ for (User *U : Call->users())
+ if (ICmpInst *I = dyn_cast<ICmpInst>(U))
+ ToSimplify.push_back(I);
+
Call->replaceAllUsesWith(ConstantInt::get(Call->getType(), ReflectVal));
ToRemove.push_back(Call);
}
for (Instruction *I : ToRemove)
I->eraseFromParent();
+ // The code guarded by __nvvm_reflect may be invalid for the target machine.
+ // We need to do some basic dead code elimination to trim invalid code before
+ // it reaches the backend at all optimization levels.
+ SmallVector<BranchInst *> Simplified;
+ for (ICmpInst *Cmp : ToSimplify) {
+ Constant *LHS = dyn_cast<Constant>(Cmp->getOperand(0));
+ Constant *RHS = dyn_cast<Constant>(Cmp->getOperand(1));
+
+ if (!LHS || !RHS)
+ continue;
+
+ // If the comparison is a compile time constat we sipmly propagate it.
----------------
jlebar wrote:
constant
https://github.com/llvm/llvm-project/pull/81189
More information about the llvm-commits
mailing list