[llvm] [GlobalISel][IRTranslator] Lower ptr/non-ptr bitcasts via G_INTTOPTR/G_PTRTOINT (PR #203335)
Petar Avramovic via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 12 03:15:47 PDT 2026
================
@@ -1596,16 +1598,71 @@ bool IRTranslator::translateBitCast(const User &U,
return translateCopy(U, *U.getOperand(0), MIRBuilder);
}
- // Only the scalar byte<->ptr crossing is redirected to G_INTTOPTR/G_PTRTOINT,
- // which is the well-typed MIR shape for that boundary. Vector byte<->ptr
- // (e.g. <N x b32> -> ptr produced by mixed-type load coalescing) and other
- // legacy ptr/non-ptr IR bitcasts (AMDGPU iN<->p3 kernarg packing, etc.)
- // keep their historical G_BITCAST lowering — G_INTTOPTR has no vector-src
- // -> scalar-ptr form, and downstream passes already handle G_BITCAST.
- if (DstTy->isPointerTy() && SrcTy->isByteTy())
- return translateCast(TargetOpcode::G_INTTOPTR, U, MIRBuilder);
- if (SrcTy->isPointerTy() && DstTy->isByteTy())
- return translateCast(TargetOpcode::G_PTRTOINT, U, MIRBuilder);
+ // Emit G_INTTOPTR
+ if (!SrcTy->isPointerTy() && DstTy->isPointerTy()) {
+ if (DstTyBits == SrcTyBits) {
+ if (!mayTranslateUserTypes(U))
+ return false;
+
+ uint32_t Flags = 0;
+ if (const Instruction *I = dyn_cast<Instruction>(&U))
+ Flags = MachineInstr::copyFlagsFromInstruction(*I);
+
+ Register SrcReg = getOrCreateVReg(*U.getOperand(0));
+ Register DstReg = getOrCreateVReg(U);
+ MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
+ LLT IntLLT = LLT::scalar(DstTyBits);
+ LLT SrcLLT = MRI.getType(SrcReg);
+
+ // Prefer IR integer check; also accept when the operand is already the
+ // pointer-sized scalar LLT (e.g. i64 value lowered to s64) so we never
+ // emit G_BITCAST sN -> sN, which MachineVerifier rejects.
+ if ((SrcTy->isIntegerTy() &&
+ cast<IntegerType>(SrcTy)->getBitWidth() == DstTyBits) ||
+ SrcLLT == IntLLT) {
+ MIRBuilder.buildInstr(TargetOpcode::G_INTTOPTR, {DstReg}, {SrcReg},
+ Flags);
+ return true;
+ }
+
+ auto IntVal = MIRBuilder.buildBitcast(IntLLT, SrcReg);
+ MIRBuilder.buildInstr(TargetOpcode::G_INTTOPTR, {DstReg},
+ {IntVal.getReg(0)}, Flags);
+ return true;
+ }
----------------
petar-avramovic wrote:
should be able to simplify
if(...){
Src = build-Bitcast
}
build-IntToPtr(Src)
return true
https://github.com/llvm/llvm-project/pull/203335
More information about the llvm-commits
mailing list