Skip to content

Commit 6550044

Browse files
Implemented the changes based on the feedback accordingly.
1 parent 519453e commit 6550044

File tree

3 files changed

+53
-26
lines changed

3 files changed

+53
-26
lines changed

llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3340,23 +3340,6 @@ bool NVPTXTargetLowering::splitValueIntoRegisterParts(
33403340
return false;
33413341
}
33423342

3343-
bool llvm::NVPTXTargetLowering::isTruncateFree(EVT FromVT, EVT ToVT) const {
3344-
if (FromVT.isVector() || ToVT.isVector() || !FromVT.isInteger() ||
3345-
!ToVT.isInteger()) {
3346-
return false;
3347-
}
3348-
3349-
return FromVT.getSizeInBits() == 64 && ToVT.getSizeInBits() == 32;
3350-
}
3351-
3352-
bool llvm::NVPTXTargetLowering::isZExtFree(EVT FromVT, EVT ToVT) const {
3353-
return false;
3354-
}
3355-
3356-
bool llvm::NVPTXTargetLowering::isZExtFree(Type *SrcTy, Type *DstTy) const {
3357-
return false;
3358-
}
3359-
33603343
// This creates target external symbol for a function parameter.
33613344
// Name of the symbol is composed from its index and the function name.
33623345
// Negative index corresponds to special parameter (unsized array) used for

llvm/lib/Target/NVPTX/NVPTXISelLowering.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,17 @@ class NVPTXTargetLowering : public TargetLowering {
506506
DstTy->getPrimitiveSizeInBits() == 32;
507507
}
508508

509+
bool isTruncateFree(EVT FromVT, EVT ToVT) const override {
510+
if (!FromVT.isScalarInteger() || !ToVT.isScalarInteger()) {
511+
return false;
512+
}
513+
return FromVT.getSizeInBits() == 64 && ToVT.getSizeInBits() == 32;
514+
}
515+
516+
bool isZExtFree(EVT FromVT, EVT ToVT) const override { return false; }
517+
518+
bool isZExtFree(Type *SrcTy, Type *DstTy) const override { return false; }
519+
509520
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Ctx,
510521
EVT VT) const override {
511522
if (VT.isVector())
@@ -616,10 +627,6 @@ class NVPTXTargetLowering : public TargetLowering {
616627
return true;
617628
}
618629

619-
bool isTruncateFree(EVT FromVT, EVT ToVT) const override;
620-
bool isZExtFree(EVT FromVT, EVT ToVT) const override;
621-
bool isZExtFree(Type *SrcTy, Type *DstTy) const override;
622-
623630
private:
624631
const NVPTXSubtarget &STI; // cache the subtarget here
625632
SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,54 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
12
; RUN: llc -march=nvptx64 < %s | FileCheck %s
23

34
; Test for truncation from i64 to i32
45
define i32 @test_trunc_i64_to_i32(i64 %val) {
5-
; CHECK-LABEL: test_trunc_i64_to_i32
6-
; CHECK: trunc
6+
; CHECK-LABEL: test_trunc_i64_to_i32(
7+
; CHECK: {
8+
; CHECK-NEXT: .reg .b32 %r<2>;
9+
; CHECK-EMPTY:
10+
; CHECK-NEXT: // %bb.0:
11+
; CHECK-NEXT: ld.param.u32 %r1, [test_trunc_i64_to_i32_param_0];
12+
; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
13+
; CHECK-NEXT: ret;
714
%trunc = trunc i64 %val to i32
815
ret i32 %trunc
916
}
1017

1118
; Test for zero-extension from i32 to i64
1219
define i64 @test_zext_i32_to_i64(i32 %val) {
13-
; CHECK-LABEL: test_zext_i32_to_i64
14-
; CHECK: zext
20+
; CHECK-LABEL: test_zext_i32_to_i64(
21+
; CHECK: {
22+
; CHECK-NEXT: .reg .b64 %rd<2>;
23+
; CHECK-EMPTY:
24+
; CHECK-NEXT: // %bb.0:
25+
; CHECK-NEXT: ld.param.u32 %rd1, [test_zext_i32_to_i64_param_0];
26+
; CHECK-NEXT: st.param.b64 [func_retval0], %rd1;
27+
; CHECK-NEXT: ret;
1528
%zext = zext i32 %val to i64
1629
ret i64 %zext
17-
}
30+
}
31+
32+
; Test for operand truncation before select
33+
define i32 @test_select_truncate_free(i1 %cond, i64 %a, i64 %b) {
34+
; CHECK-LABEL: test_select_truncate_free(
35+
; CHECK: {
36+
; CHECK-NEXT: .reg .pred %p<2>;
37+
; CHECK-NEXT: .reg .b16 %rs<3>;
38+
; CHECK-NEXT: .reg .b32 %r<4>;
39+
; CHECK-EMPTY:
40+
; CHECK-NEXT: // %bb.0:
41+
; CHECK-NEXT: ld.param.u8 %rs1, [test_select_truncate_free_param_0];
42+
; CHECK-NEXT: and.b16 %rs2, %rs1, 1;
43+
; CHECK-NEXT: setp.eq.b16 %p1, %rs2, 1;
44+
; CHECK-NEXT: ld.param.u32 %r1, [test_select_truncate_free_param_1];
45+
; CHECK-NEXT: ld.param.u32 %r2, [test_select_truncate_free_param_2];
46+
; CHECK-NEXT: selp.b32 %r3, %r1, %r2, %p1;
47+
; CHECK-NEXT: st.param.b32 [func_retval0], %r3;
48+
; CHECK-NEXT: ret;
49+
50+
%trunc_a = trunc i64 %a to i32
51+
%trunc_b = trunc i64 %b to i32
52+
%result = select i1 %cond, i32 %trunc_a, i32 %trunc_b
53+
ret i32 %result
54+
}

0 commit comments

Comments
 (0)