[PATCH] D102759: [AArch64ISelDAGToDAG] Supplement cases for ORRWrs/ORRXrs when calculating usefulbits

Mindong Chen via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 5 09:43:59 PDT 2021


This revision was automatically updated to reflect the committed changes.
Closed by commit rGd4ed965b2d14: [AArch64ISelDAGToDAG] Fix ORRWrs/ORRXrs usefulbits calculation bug (authored by TiehuZhang, committed by mdchen).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D102759/new/

https://reviews.llvm.org/D102759

Files:
  llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
  llvm/test/CodeGen/AArch64/arm64-isel-or.ll


Index: llvm/test/CodeGen/AArch64/arm64-isel-or.ll
===================================================================
--- /dev/null
+++ 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
+}
Index: llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
+++ llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
@@ -2306,10 +2306,10 @@
 
   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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102759.356519.patch
Type: text/x-patch
Size: 2446 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210705/6c42746c/attachment.bin>


More information about the llvm-commits mailing list