[llvm] 57c6fe2 - [CSKY] Optimize multiplication with immediates

Ben Shi via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 7 23:14:17 PDT 2023


Author: Ben Shi
Date: 2023-08-08T14:13:49+08:00
New Revision: 57c6fe273f237cca8c045a8c02266117c4ff72fb

URL: https://github.com/llvm/llvm-project/commit/57c6fe273f237cca8c045a8c02266117c4ff72fb
DIFF: https://github.com/llvm/llvm-project/commit/57c6fe273f237cca8c045a8c02266117c4ff72fb.diff

LOG: [CSKY] Optimize multiplication with immediates

Optimize "Rx * imm" for specific immediates to
([IXH32|IXW32|IXD32] (LSLI Rx, shift), Rx).

Reviewed By: zixuan-wu

Differential Revision: https://reviews.llvm.org/D154768

Added: 
    

Modified: 
    llvm/lib/Target/CSKY/CSKYISelLowering.cpp
    llvm/test/CodeGen/CSKY/mul-imm.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/CSKY/CSKYISelLowering.cpp b/llvm/lib/Target/CSKY/CSKYISelLowering.cpp
index ff48174228f172..e3b4a2dc048ab2 100644
--- a/llvm/lib/Target/CSKY/CSKYISelLowering.cpp
+++ b/llvm/lib/Target/CSKY/CSKYISelLowering.cpp
@@ -1397,6 +1397,13 @@ bool CSKYTargetLowering::decomposeMulByConstant(LLVMContext &Context, EVT VT,
     // unchanged on sub targets with MULT32, since not sure it is better.
     if (!Subtarget.hasE2() && (-1 - Imm).isPowerOf2())
       return true;
+    // Break (MULT x, imm) to ([IXH32|IXW32|IXD32] (LSLI32 x, i0), x) when
+    // imm=(1<<i0)+[2|4|8] and imm has to be composed via a MOVIH32/ORI32 pair.
+    if (Imm.ugt(0xffff) && ((Imm - 2).isPowerOf2() || (Imm - 4).isPowerOf2()) &&
+        Subtarget.hasE2())
+      return true;
+    if (Imm.ugt(0xffff) && (Imm - 8).isPowerOf2() && Subtarget.has2E3())
+      return true;
   }
 
   return false;

diff  --git a/llvm/test/CodeGen/CSKY/mul-imm.ll b/llvm/test/CodeGen/CSKY/mul-imm.ll
index 15c581cbdc538d..0250b3c2f85bab 100644
--- a/llvm/test/CodeGen/CSKY/mul-imm.ll
+++ b/llvm/test/CodeGen/CSKY/mul-imm.ll
@@ -1,5 +1,5 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
-; RUN: llc -verify-machineinstrs -csky-no-aliases -mattr=+e2 < %s -mtriple=csky | FileCheck %s
+; RUN: llc -verify-machineinstrs -csky-no-aliases -mattr=+2e3 < %s -mtriple=csky | FileCheck %s
 ; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky | FileCheck %s --check-prefix=GENERIC
 
 ;; This file shows if a multiplication can be simplified to an addition/subtraction
@@ -71,9 +71,8 @@ entry:
 define i32 @mul_i32_131074(i32 %x) {
 ; CHECK-LABEL: mul_i32_131074:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    movih32 a1, 2
-; CHECK-NEXT:    ori32 a1, a1, 2
-; CHECK-NEXT:    mult16 a0, a1
+; CHECK-NEXT:    lsli16 a1, a0, 17
+; CHECK-NEXT:    ixh32 a0, a1, a0
 ; CHECK-NEXT:    rts16
 ;
 ; GENERIC-LABEL: mul_i32_131074:
@@ -105,9 +104,8 @@ entry:
 define i32 @mul_i32_131076(i32 %x) {
 ; CHECK-LABEL: mul_i32_131076:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    movih32 a1, 2
-; CHECK-NEXT:    ori32 a1, a1, 4
-; CHECK-NEXT:    mult16 a0, a1
+; CHECK-NEXT:    lsli16 a1, a0, 17
+; CHECK-NEXT:    ixw32 a0, a1, a0
 ; CHECK-NEXT:    rts16
 ;
 ; GENERIC-LABEL: mul_i32_131076:
@@ -135,9 +133,8 @@ entry:
 define i32 @mul_i32_131080(i32 %x) {
 ; CHECK-LABEL: mul_i32_131080:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    movih32 a1, 2
-; CHECK-NEXT:    ori32 a1, a1, 8
-; CHECK-NEXT:    mult16 a0, a1
+; CHECK-NEXT:    lsli16 a1, a0, 17
+; CHECK-NEXT:    ixd32 a0, a1, a0
 ; CHECK-NEXT:    rts16
 ;
 ; GENERIC-LABEL: mul_i32_131080:
@@ -369,10 +366,9 @@ define i64 @mul_i64_4097(i64 %x) {
 ; CHECK-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
 ; CHECK-NEXT:    .cfi_offset lr, -4
 ; CHECK-NEXT:    .cfi_def_cfa_offset 4
-; CHECK-NEXT:    lrw32 t0, [.LCPI15_0]
 ; CHECK-NEXT:    movi32 a2, 4097
 ; CHECK-NEXT:    movi16 a3, 0
-; CHECK-NEXT:    jsr16 t0
+; CHECK-NEXT:    jsri32 [.LCPI15_0]
 ; CHECK-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
 ; CHECK-NEXT:    addi16 sp, sp, 4
 ; CHECK-NEXT:    rts16


        


More information about the llvm-commits mailing list