Skip to content

Commit 5e1852a

Browse files
Implement isTruncateFree(EVT FromVT, EVT ToVT)
1 parent 230f332 commit 5e1852a

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

llvm/lib/Target/NVPTX/NVPTXISelLowering.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,19 @@ class NVPTXTargetLowering : public TargetLowering {
155155
Instruction *I = nullptr) const override;
156156

157157
bool isTruncateFree(Type *SrcTy, Type *DstTy) const override {
158-
// Truncating 64-bit to 32-bit is free in SASS.
159-
if (!SrcTy->isIntegerTy() || !DstTy->isIntegerTy())
158+
if (!(SrcTy->isIntegerTy() && DstTy->isIntegerTy()))
160159
return false;
161-
return SrcTy->getPrimitiveSizeInBits() == 64 &&
162-
DstTy->getPrimitiveSizeInBits() == 32;
160+
if (SrcTy->getPrimitiveSizeInBits() <= DstTy->getPrimitiveSizeInBits())
161+
return false;
162+
return DstTy->getPrimitiveSizeInBits() % 32 == 0;
163+
}
164+
165+
bool isTruncateFree(EVT FromVT, EVT ToVT) const override {
166+
if (!(FromVT.isScalarInteger() && ToVT.isScalarInteger()))
167+
return false;
168+
if (FromVT.getSizeInBits() <= ToVT.getSizeInBits())
169+
return false;
170+
return ToVT.getSizeInBits() % 32 == 0;
163171
}
164172

165173
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Ctx,

llvm/test/CodeGen/NVPTX/i128-array.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ define [2 x i128] @foo(i64 %a, i32 %b) {
88
; CHECK-NEXT: .reg .b64 %rd<5>;
99
; CHECK-EMPTY:
1010
; CHECK-NEXT: // %bb.0:
11-
; CHECK-NEXT: ld.param.u32 %r1, [foo_param_1];
1211
; CHECK-NEXT: ld.param.u64 %rd1, [foo_param_0];
13-
; CHECK-NEXT: shr.s64 %rd2, %rd1, 63;
14-
; CHECK-NEXT: cvt.s64.s32 %rd3, %r1;
15-
; CHECK-NEXT: shr.s64 %rd4, %rd3, 63;
16-
; CHECK-NEXT: st.param.v2.b64 [func_retval0], {%rd1, %rd2};
17-
; CHECK-NEXT: st.param.v2.b64 [func_retval0+16], {%rd3, %rd4};
12+
; CHECK-NEXT: ld.param.s32 %rd2, [foo_param_1];
13+
; CHECK-NEXT: cvt.u32.u64 %r1, %rd2;
14+
; CHECK-NEXT: shr.s64 %rd3, %rd1, 63;
15+
; CHECK-NEXT: shr.s64 %rd4, %rd2, 63;
16+
; CHECK-NEXT: st.param.v2.b64 [func_retval0], {%rd1, %rd3};
17+
; CHECK-NEXT: st.param.v2.b64 [func_retval0+16], {%rd2, %rd4};
1818
; CHECK-NEXT: ret;
1919
%1 = sext i64 %a to i128
2020
%2 = sext i32 %b to i128

0 commit comments

Comments
 (0)