Skip to content

Commit d4ed965

Browse files
huhu233cmd120
authored andcommitted
[AArch64ISelDAGToDAG] Fix ORRWrs/ORRXrs usefulbits calculation bug
For the following case: t8: i32 = or t7, t4 t10: i32 = ORRWrs t8, t8, TargetConstant:i32<73> Current code wrongly returns (t8 >> shiftConstant) as the UsefulBits of t8, which in fact is (t8 | (t8 >> shiftConstant)). Reviewed by: sdesmalen, mdchen Differential Revision: https://reviews.llvm.org/D102759
1 parent 8852245 commit d4ed965

File tree

2 files changed

+50
-4
lines changed

2 files changed

+50
-4
lines changed

llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2306,10 +2306,10 @@ static void getUsefulBitsForUse(SDNode *UserNode, APInt &UsefulBits,
23062306

23072307
case AArch64::ORRWrs:
23082308
case AArch64::ORRXrs:
2309-
if (UserNode->getOperand(1) != Orig)
2310-
return;
2311-
return getUsefulBitsFromOrWithShiftedReg(SDValue(UserNode, 0), UsefulBits,
2312-
Depth);
2309+
if (UserNode->getOperand(0) != Orig && UserNode->getOperand(1) == Orig)
2310+
getUsefulBitsFromOrWithShiftedReg(SDValue(UserNode, 0), UsefulBits,
2311+
Depth);
2312+
return;
23132313
case AArch64::BFMWri:
23142314
case AArch64::BFMXri:
23152315
return getUsefulBitsFromBFM(SDValue(UserNode, 0), Orig, UsefulBits, Depth);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -o - | FileCheck %s
3+
; ModuleID = '<stdin>'
4+
source_filename = "<stdin>"
5+
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
6+
target triple = "aarch64-unknown-linux-gnu"
7+
8+
define i32 @Orlshr(i32 %e) {
9+
; CHECK-LABEL: Orlshr:
10+
; CHECK: // %bb.0: // %entry
11+
; CHECK-NEXT: orr w8, w0, w0, lsr #15
12+
; CHECK-NEXT: orr w8, w8, w8, lsr #15
13+
; CHECK-NEXT: orr w8, w8, w8, lsr #15
14+
; CHECK-NEXT: orr w0, w8, w8, lsr #15
15+
; CHECK-NEXT: ret
16+
entry:
17+
%shr = lshr i32 %e, 15
18+
%or = or i32 %shr, %e
19+
%shr.1 = lshr i32 %or, 15
20+
%or.1 = or i32 %shr.1, %or
21+
%shr.2 = lshr i32 %or.1, 15
22+
%or.2 = or i32 %shr.2, %or.1
23+
%shr.3 = lshr i32 %or.2, 15
24+
%or.3 = or i32 %shr.3, %or.2
25+
ret i32 %or.3
26+
}
27+
28+
define i32 @Orshl(i32 %e) {
29+
; CHECK-LABEL: Orshl:
30+
; CHECK: // %bb.0: // %entry
31+
; CHECK-NEXT: orr w8, w0, w0, lsl #15
32+
; CHECK-NEXT: orr w8, w8, w8, lsl #15
33+
; CHECK-NEXT: orr w8, w8, w8, lsl #15
34+
; CHECK-NEXT: orr w0, w8, w8, lsl #15
35+
; CHECK-NEXT: ret
36+
entry:
37+
%shl = shl i32 %e, 15
38+
%or = or i32 %shl, %e
39+
%shl.1 = shl i32 %or, 15
40+
%or.1 = or i32 %shl.1, %or
41+
%shl.2 = shl i32 %or.1, 15
42+
%or.2 = or i32 %shl.2, %or.1
43+
%shl.3 = shl i32 %or.2, 15
44+
%or.3 = or i32 %shl.3, %or.2
45+
ret i32 %or.3
46+
}

0 commit comments

Comments
 (0)