Skip to content

Commit f5ad399

Browse files
committed
[NVPTX] Fix bug in sign of bfe folding
1 parent 96436ff commit f5ad399

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2039,6 +2039,11 @@ bool NVPTXDAGToDAGISel::tryBFE(SDNode *N) {
20392039
Val = AndLHS;
20402040
Start = CurDAG->getTargetConstant(ShiftAmt, DL, MVT::i32);
20412041
Len = CurDAG->getTargetConstant(NumBits, DL, MVT::i32);
2042+
2043+
// If we have a arithmetic right shift, we need to use the signed bfe
2044+
// variant only if the MSB is copied as part of the mask
2045+
if (N->getOpcode() == ISD::SRA)
2046+
IsSigned = (ShiftAmt + NumBits) == Val.getValueSizeInBits();
20422047
} else if (LHS->getOpcode() == ISD::SHL) {
20432048
// Here, we have a pattern like:
20442049
//

llvm/test/CodeGen/NVPTX/bfe.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ define i32 @bfe_ashr_signed_32(i32 %x) {
132132
; CHECK-O0-EMPTY:
133133
; CHECK-O0-NEXT: // %bb.0:
134134
; CHECK-O0-NEXT: ld.param.u32 %r1, [bfe_ashr_signed_32_param_0];
135-
; CHECK-O0-NEXT: bfe.u32 %r2, %r1, 20, 12;
135+
; CHECK-O0-NEXT: bfe.s32 %r2, %r1, 20, 12;
136136
; CHECK-O0-NEXT: st.param.b32 [func_retval0], %r2;
137137
; CHECK-O0-NEXT: ret;
138138
%and = and i32 %x, -65536
@@ -162,7 +162,7 @@ define i64 @bfe_ashr_signed_64(i64 %x) {
162162
; CHECK-EMPTY:
163163
; CHECK-NEXT: // %bb.0:
164164
; CHECK-NEXT: ld.param.u64 %rd1, [bfe_ashr_signed_64_param_0];
165-
; CHECK-NEXT: bfe.u64 %rd2, %rd1, 16, 48;
165+
; CHECK-NEXT: bfe.s64 %rd2, %rd1, 16, 48;
166166
; CHECK-NEXT: st.param.b64 [func_retval0], %rd2;
167167
; CHECK-NEXT: ret;
168168
%and = and i64 %x, -65536
@@ -194,7 +194,7 @@ define i32 @bfe3(i128 %a) {
194194
; CHECK-NEXT: // %bb.0:
195195
; CHECK-NEXT: ld.param.v2.u64 {%rd1, %rd2}, [bfe3_param_0];
196196
; CHECK-NEXT: cvt.u32.u64 %r1, %rd1;
197-
; CHECK-NEXT: bfe.u32 %r2, %r1, 15, 17;
197+
; CHECK-NEXT: bfe.s32 %r2, %r1, 15, 17;
198198
; CHECK-NEXT: st.param.b32 [func_retval0], %r2;
199199
; CHECK-NEXT: ret;
200200
%trunc = trunc i128 %a to i32
@@ -210,7 +210,7 @@ define i64 @bfe4(i128 %a) {
210210
; CHECK-EMPTY:
211211
; CHECK-NEXT: // %bb.0:
212212
; CHECK-NEXT: ld.param.v2.u64 {%rd1, %rd2}, [bfe4_param_0];
213-
; CHECK-NEXT: bfe.u64 %rd3, %rd1, 17, 47;
213+
; CHECK-NEXT: bfe.s64 %rd3, %rd1, 17, 47;
214214
; CHECK-NEXT: st.param.b64 [func_retval0], %rd3;
215215
; CHECK-NEXT: ret;
216216
%trunc = trunc i128 %a to i64

0 commit comments

Comments
 (0)