Skip to content

Commit 4e30d78

Browse files
authored
[RISCV] Add TH_EXT(U) to hasAllNBitUsers in RISCVOptWInstrs. (#157544)
1 parent dbdac9f commit 4e30d78

File tree

4 files changed

+101
-3
lines changed

4 files changed

+101
-3
lines changed

llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,14 @@ static bool hasAllNBitUsers(const MachineInstr &OrigMI,
356356
return false;
357357
Worklist.emplace_back(UserMI, Bits);
358358
break;
359+
case RISCV::TH_EXT:
360+
case RISCV::TH_EXTU:
361+
unsigned Msb = UserMI->getOperand(2).getImm();
362+
unsigned Lsb = UserMI->getOperand(3).getImm();
363+
// Behavior of Msb < Lsb is not well documented.
364+
if (Msb >= Lsb && Bits > Msb)
365+
break;
366+
return false;
359367
}
360368
}
361369
}

llvm/test/CodeGen/RISCV/bitextract-mac.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ define i32 @f(i32 %A, i32 %B, i32 %C) {
107107
;
108108
; RV64XTHEADBB-LABEL: f:
109109
; RV64XTHEADBB: # %bb.0: # %entry
110-
; RV64XTHEADBB-NEXT: mulw a0, a1, a0
110+
; RV64XTHEADBB-NEXT: mul a0, a1, a0
111111
; RV64XTHEADBB-NEXT: th.extu a1, a0, 5, 2
112112
; RV64XTHEADBB-NEXT: th.extu a0, a0, 11, 5
113113
; RV64XTHEADBB-NEXT: mul a0, a1, a0
@@ -116,7 +116,7 @@ define i32 @f(i32 %A, i32 %B, i32 %C) {
116116
;
117117
; RV64XTHEAD-LABEL: f:
118118
; RV64XTHEAD: # %bb.0: # %entry
119-
; RV64XTHEAD-NEXT: mulw a0, a1, a0
119+
; RV64XTHEAD-NEXT: mul a0, a1, a0
120120
; RV64XTHEAD-NEXT: th.extu a1, a0, 5, 2
121121
; RV64XTHEAD-NEXT: th.extu a0, a0, 11, 5
122122
; RV64XTHEAD-NEXT: th.mulah a2, a1, a0

llvm/test/CodeGen/RISCV/ctlz-cttz-ctpop.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2438,7 +2438,7 @@ define i16 @test_ctpop_i16(i16 %a) nounwind {
24382438
; RV64XTHEADBB-NEXT: and a0, a0, a2
24392439
; RV64XTHEADBB-NEXT: add a0, a1, a0
24402440
; RV64XTHEADBB-NEXT: srli a1, a0, 4
2441-
; RV64XTHEADBB-NEXT: addw a0, a0, a1
2441+
; RV64XTHEADBB-NEXT: add a0, a0, a1
24422442
; RV64XTHEADBB-NEXT: th.extu a1, a0, 11, 8
24432443
; RV64XTHEADBB-NEXT: andi a0, a0, 15
24442444
; RV64XTHEADBB-NEXT: add a0, a0, a1

llvm/test/CodeGen/RISCV/rv64xtheadbb.ll

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,3 +1220,93 @@ bb2: ; preds = %bb2, %bb
12201220
bb7: ; preds = %bb2
12211221
ret void
12221222
}
1223+
1224+
define signext i32 @hasAllNBitUsers_extu(i64 %arg1, i64 %arg2, i64 %arg3) {
1225+
; RV64I-LABEL: hasAllNBitUsers_extu:
1226+
; RV64I: # %bb.0: # %entry
1227+
; RV64I-NEXT: addi a2, a2, -1
1228+
; RV64I-NEXT: li a3, 256
1229+
; RV64I-NEXT: .LBB38_1: # %bb2
1230+
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
1231+
; RV64I-NEXT: slli a0, a0, 47
1232+
; RV64I-NEXT: srli a0, a0, 62
1233+
; RV64I-NEXT: addi a2, a2, 1
1234+
; RV64I-NEXT: addw a0, a0, a1
1235+
; RV64I-NEXT: bltu a2, a3, .LBB38_1
1236+
; RV64I-NEXT: # %bb.2: # %bb7
1237+
; RV64I-NEXT: ret
1238+
;
1239+
; RV64XTHEADBB-LABEL: hasAllNBitUsers_extu:
1240+
; RV64XTHEADBB: # %bb.0: # %entry
1241+
; RV64XTHEADBB-NEXT: addi a2, a2, -1
1242+
; RV64XTHEADBB-NEXT: li a3, 256
1243+
; RV64XTHEADBB-NEXT: .LBB38_1: # %bb2
1244+
; RV64XTHEADBB-NEXT: # =>This Inner Loop Header: Depth=1
1245+
; RV64XTHEADBB-NEXT: th.extu a0, a0, 16, 15
1246+
; RV64XTHEADBB-NEXT: addi a2, a2, 1
1247+
; RV64XTHEADBB-NEXT: addw a0, a0, a1
1248+
; RV64XTHEADBB-NEXT: bltu a2, a3, .LBB38_1
1249+
; RV64XTHEADBB-NEXT: # %bb.2: # %bb7
1250+
; RV64XTHEADBB-NEXT: ret
1251+
entry:
1252+
br label %bb2
1253+
1254+
bb2: ; preds = %bb2, %entry
1255+
%i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]
1256+
%i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]
1257+
%i3 = add i64 %i2, 1
1258+
%i4 = lshr i64 %i1, 15
1259+
%i4b = and i64 %i4, 3
1260+
%i5 = add i64 %i4b, %arg2
1261+
%i6 = icmp ugt i64 %i2, 255
1262+
br i1 %i6, label %bb7, label %bb2
1263+
1264+
bb7: ; preds = %bb2
1265+
%i7 = trunc i64 %i5 to i32
1266+
ret i32 %i7
1267+
}
1268+
1269+
define signext i32 @hasAllNBitUsers_ext(i64 %arg1, i64 %arg2, i64 %arg3) {
1270+
; RV64I-LABEL: hasAllNBitUsers_ext:
1271+
; RV64I: # %bb.0: # %entry
1272+
; RV64I-NEXT: addi a2, a2, -1
1273+
; RV64I-NEXT: li a3, 256
1274+
; RV64I-NEXT: .LBB39_1: # %bb2
1275+
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
1276+
; RV64I-NEXT: slli a0, a0, 47
1277+
; RV64I-NEXT: srli a0, a0, 62
1278+
; RV64I-NEXT: addi a2, a2, 1
1279+
; RV64I-NEXT: addw a0, a0, a1
1280+
; RV64I-NEXT: bltu a2, a3, .LBB39_1
1281+
; RV64I-NEXT: # %bb.2: # %bb7
1282+
; RV64I-NEXT: ret
1283+
;
1284+
; RV64XTHEADBB-LABEL: hasAllNBitUsers_ext:
1285+
; RV64XTHEADBB: # %bb.0: # %entry
1286+
; RV64XTHEADBB-NEXT: addi a2, a2, -1
1287+
; RV64XTHEADBB-NEXT: li a3, 256
1288+
; RV64XTHEADBB-NEXT: .LBB39_1: # %bb2
1289+
; RV64XTHEADBB-NEXT: # =>This Inner Loop Header: Depth=1
1290+
; RV64XTHEADBB-NEXT: th.extu a0, a0, 16, 15
1291+
; RV64XTHEADBB-NEXT: addi a2, a2, 1
1292+
; RV64XTHEADBB-NEXT: addw a0, a0, a1
1293+
; RV64XTHEADBB-NEXT: bltu a2, a3, .LBB39_1
1294+
; RV64XTHEADBB-NEXT: # %bb.2: # %bb7
1295+
; RV64XTHEADBB-NEXT: ret
1296+
entry:
1297+
br label %bb2
1298+
1299+
bb2: ; preds = %bb2, %entry
1300+
%i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]
1301+
%i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]
1302+
%i3 = add i64 %i2, 1
1303+
%i4 = ashr i64 %i1, 15
1304+
%i4b = and i64 %i4, 3
1305+
%i5 = add i64 %i4b, %arg2
1306+
%i6 = icmp ugt i64 %i2, 255
1307+
br i1 %i6, label %bb7, label %bb2
1308+
1309+
bb7: ; preds = %bb2
1310+
%i7 = trunc i64 %i5 to i32
1311+
ret i32 %i7
1312+
}

0 commit comments

Comments
 (0)