From f43171b27dd59a4d71de4a891cad4006d7fc1a6c Mon Sep 17 00:00:00 2001 From: ujjawalk Date: Sat, 2 Nov 2024 15:07:34 +0530 Subject: [PATCH] Implemented isZextFree and IsTruncateFree in NVPTX target lowering. --- llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp | 23 +++++++++++++++++++++ llvm/lib/Target/NVPTX/NVPTXISelLowering.h | 4 ++++ llvm/test/CodeGen/NVPTX/truncate_zext.ll | 17 +++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 llvm/test/CodeGen/NVPTX/truncate_zext.ll diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp index d3bf0ecfe2cc9..b5fc975d71dfa 100644 --- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -3340,6 +3340,29 @@ bool NVPTXTargetLowering::splitValueIntoRegisterParts( return false; } +bool llvm::NVPTXTargetLowering::isTruncateFree(EVT FromVT, EVT ToVT) const { + + if (!FromVT.isSimple() || !ToVT.isSimple()) { + return false; + } + + return (FromVT.getSimpleVT() == MVT::i64 && ToVT.getSimpleVT() == MVT::i32); +} + +bool llvm::NVPTXTargetLowering::isZExtFree(EVT FromVT, EVT ToVT) const { + if (!FromVT.isSimple() || !ToVT.isSimple()) { + return false; + } + return (FromVT.getSimpleVT() == MVT::i32 && ToVT.getSimpleVT() == MVT::i64); +} + +bool llvm::NVPTXTargetLowering::isZExtFree(Type *SrcTy, Type *DstTy) const { + if (!SrcTy->isIntegerTy() || !DstTy->isIntegerTy()) + return false; + return SrcTy->getPrimitiveSizeInBits() == 32 && + DstTy->getPrimitiveSizeInBits() == 64; +} + // This creates target external symbol for a function parameter. // Name of the symbol is composed from its index and the function name. // Negative index corresponds to special parameter (unsized array) used for diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.h b/llvm/lib/Target/NVPTX/NVPTXISelLowering.h index c8b589ae39413..fa73938a35a16 100644 --- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.h +++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.h @@ -616,6 +616,10 @@ class NVPTXTargetLowering : public TargetLowering { return true; } + bool isTruncateFree(EVT FromVT, EVT ToVT) const override; + bool isZExtFree(EVT FromVT, EVT ToVT) const override; + bool isZExtFree(Type *SrcTy, Type *DstTy) const override; + private: const NVPTXSubtarget &STI; // cache the subtarget here SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const; diff --git a/llvm/test/CodeGen/NVPTX/truncate_zext.ll b/llvm/test/CodeGen/NVPTX/truncate_zext.ll new file mode 100644 index 0000000000000..decc02c584049 --- /dev/null +++ b/llvm/test/CodeGen/NVPTX/truncate_zext.ll @@ -0,0 +1,17 @@ +; RUN: llc -march=nvptx64 < %s | FileCheck %s + +; Test for truncation from i64 to i32 +define i32 @test_trunc_i64_to_i32(i64 %val) { + ; CHECK-LABEL: test_trunc_i64_to_i32 + ; CHECK: trunc + %trunc = trunc i64 %val to i32 + ret i32 %trunc +} + +; Test for zero-extension from i32 to i64 +define i64 @test_zext_i32_to_i64(i32 %val) { + ; CHECK-LABEL: test_zext_i32_to_i64 + ; CHECK: zext + %zext = zext i32 %val to i64 + ret i64 %zext +} \ No newline at end of file