[llvm] d4ed965 - [AArch64ISelDAGToDAG] Fix ORRWrs/ORRXrs usefulbits calculation bug
Mindong Chen via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 5 09:43:51 PDT 2021
Author: Tiehu Zhang
Date: 2021-07-06T00:38:42+08:00
New Revision: d4ed965b2d14361e4273525a9888344a25f3800c
URL: https://github.com/llvm/llvm-project/commit/d4ed965b2d14361e4273525a9888344a25f3800c
DIFF: https://github.com/llvm/llvm-project/commit/d4ed965b2d14361e4273525a9888344a25f3800c.diff
LOG: [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
Added:
llvm/test/CodeGen/AArch64/arm64-isel-or.ll
Modified:
llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
index bdd8a2b804af..cd671269192f 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
@@ -2306,10 +2306,10 @@ static void getUsefulBitsForUse(SDNode *UserNode, APInt &UsefulBits,
case AArch64::ORRWrs:
case AArch64::ORRXrs:
- if (UserNode->getOperand(1) != Orig)
- return;
- return getUsefulBitsFromOrWithShiftedReg(SDValue(UserNode, 0), UsefulBits,
- Depth);
+ if (UserNode->getOperand(0) != Orig && UserNode->getOperand(1) == Orig)
+ getUsefulBitsFromOrWithShiftedReg(SDValue(UserNode, 0), UsefulBits,
+ Depth);
+ return;
case AArch64::BFMWri:
case AArch64::BFMXri:
return getUsefulBitsFromBFM(SDValue(UserNode, 0), Orig, UsefulBits, Depth);
diff --git a/llvm/test/CodeGen/AArch64/arm64-isel-or.ll b/llvm/test/CodeGen/AArch64/arm64-isel-or.ll
new file mode 100644
index 000000000000..f97dbda4c390
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/arm64-isel-or.ll
@@ -0,0 +1,46 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -o - | FileCheck %s
+; ModuleID = '<stdin>'
+source_filename = "<stdin>"
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-unknown-linux-gnu"
+
+define i32 @Orlshr(i32 %e) {
+; CHECK-LABEL: Orlshr:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: orr w8, w0, w0, lsr #15
+; CHECK-NEXT: orr w8, w8, w8, lsr #15
+; CHECK-NEXT: orr w8, w8, w8, lsr #15
+; CHECK-NEXT: orr w0, w8, w8, lsr #15
+; CHECK-NEXT: ret
+entry:
+ %shr = lshr i32 %e, 15
+ %or = or i32 %shr, %e
+ %shr.1 = lshr i32 %or, 15
+ %or.1 = or i32 %shr.1, %or
+ %shr.2 = lshr i32 %or.1, 15
+ %or.2 = or i32 %shr.2, %or.1
+ %shr.3 = lshr i32 %or.2, 15
+ %or.3 = or i32 %shr.3, %or.2
+ ret i32 %or.3
+}
+
+define i32 @Orshl(i32 %e) {
+; CHECK-LABEL: Orshl:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: orr w8, w0, w0, lsl #15
+; CHECK-NEXT: orr w8, w8, w8, lsl #15
+; CHECK-NEXT: orr w8, w8, w8, lsl #15
+; CHECK-NEXT: orr w0, w8, w8, lsl #15
+; CHECK-NEXT: ret
+entry:
+ %shl = shl i32 %e, 15
+ %or = or i32 %shl, %e
+ %shl.1 = shl i32 %or, 15
+ %or.1 = or i32 %shl.1, %or
+ %shl.2 = shl i32 %or.1, 15
+ %or.2 = or i32 %shl.2, %or.1
+ %shl.3 = shl i32 %or.2, 15
+ %or.3 = or i32 %shl.3, %or.2
+ ret i32 %or.3
+}
More information about the llvm-commits
mailing list