[llvm] Count CallInst Arguments Attributes to reduce unnecessary extension (PR #73501)

via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 27 03:04:39 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-selectiondag

Author: ZengZhijin (zengdage)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/73501.diff


2 Files Affected:

- (modified) llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp (+14) 
- (added) llvm/test/CodeGen/RISCV/reduce-unnecessary-extension.ll (+127) 


``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
index 1d0a03ccfcdc6ae..7ca6a8310b033e2 100644
--- a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
@@ -69,6 +69,20 @@ static ISD::NodeType getPreferredExtendForValue(const Instruction *I) {
       NumOfSigned += CI->isSigned();
       NumOfUnsigned += CI->isUnsigned();
     }
+    if (const auto *CallI = dyn_cast<CallInst>(U)) {
+      for (unsigned op = 0, Eop = CallI->arg_size(); op < Eop; ++op) {
+        if (CallI->getArgOperand(op) == I) {
+          const AttributeList &PAL = CallI->getAttributes();
+          AttributeSet Attrs = PAL.getParamAttrs(op);
+          if (Attrs.hasAttributes()) {
+            for (const auto &Attr : Attrs) {
+              NumOfUnsigned += Attr.hasAttribute(Attribute::ZExt);
+              NumOfSigned += Attr.hasAttribute(Attribute::SExt);
+            }
+          }
+        }
+      }
+    }
   }
   if (NumOfSigned > NumOfUnsigned)
     ExtendKind = ISD::SIGN_EXTEND;
diff --git a/llvm/test/CodeGen/RISCV/reduce-unnecessary-extension.ll b/llvm/test/CodeGen/RISCV/reduce-unnecessary-extension.ll
new file mode 100644
index 000000000000000..8723bf68572825d
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/reduce-unnecessary-extension.ll
@@ -0,0 +1,127 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=riscv64 -mattr=+zbb -verify-machineinstrs < %s \
+; RUN:   | FileCheck -check-prefix=RV64I %s
+
+ at PL_reg_match_utf8 = external dso_local local_unnamed_addr global i8, align 1
+
+declare dso_local signext i32 @test1(i8 noundef signext)
+
+declare dso_local signext i32 @test2(i8 noundef signext)
+
+declare dso_local signext i32 @test3(i8 noundef signext)
+
+define dso_local signext i32 @test() {
+; RV64I-LABEL: test:
+; RV64I:       # %bb.0:
+; RV64I-NEXT:    addi sp, sp, -16
+; RV64I-NEXT:    .cfi_def_cfa_offset 16
+; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
+; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
+; RV64I-NEXT:    .cfi_offset ra, -8
+; RV64I-NEXT:    .cfi_offset s0, -16
+; RV64I-NEXT:    lui a0, %hi(PL_reg_match_utf8)
+; RV64I-NEXT:    lb s0, %lo(PL_reg_match_utf8)(a0)
+; RV64I-NEXT:    beqz s0, .LBB0_2
+; RV64I-NEXT:  # %bb.1:
+; RV64I-NEXT:    mv a0, s0
+; RV64I-NEXT:    call test1
+; RV64I-NEXT:    mv a0, s0
+; RV64I-NEXT:    call test2
+; RV64I-NEXT:    mv a0, s0
+; RV64I-NEXT:    call test3
+; RV64I-NEXT:    j .LBB0_3
+; RV64I-NEXT:  .LBB0_2:
+; RV64I-NEXT:    li a0, 0
+; RV64I-NEXT:    call test2
+; RV64I-NEXT:  .LBB0_3:
+; RV64I-NEXT:    li a0, 0
+; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
+; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
+; RV64I-NEXT:    addi sp, sp, 16
+; RV64I-NEXT:    ret
+  %1 = load i8, ptr @PL_reg_match_utf8, align 1
+  %2 = icmp eq i8 %1, 0
+  br i1 %2, label %7, label %3
+
+3:
+  %4 = tail call signext i32 @test1(i8 noundef signext %1)
+  %5 = tail call signext i32 @test2(i8 noundef signext %1)
+  %6 = tail call signext i32 @test3(i8 noundef signext %1)
+  br label %9
+
+7:
+  %8 = tail call signext i32 @test2(i8 noundef signext 0)
+  br label %9
+
+9:
+  ret i32 0
+}
+
+
+define signext i32 @test_loop() {
+; RV64I-LABEL: test_loop:
+; RV64I:       # %bb.0:
+; RV64I-NEXT:    addi sp, sp, -32
+; RV64I-NEXT:    .cfi_def_cfa_offset 32
+; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
+; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
+; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
+; RV64I-NEXT:    .cfi_offset ra, -8
+; RV64I-NEXT:    .cfi_offset s0, -16
+; RV64I-NEXT:    .cfi_offset s1, -24
+; RV64I-NEXT:    .cfi_offset s2, -32
+; RV64I-NEXT:    li s1, -16
+; RV64I-NEXT:    lui s2, %hi(PL_reg_match_utf8)
+; RV64I-NEXT:    j .LBB1_2
+; RV64I-NEXT:  .LBB1_1: # in Loop: Header=BB1_2 Depth=1
+; RV64I-NEXT:    mv a0, s0
+; RV64I-NEXT:    call test2
+; RV64I-NEXT:    addiw s1, s1, 1
+; RV64I-NEXT:    beqz s1, .LBB1_4
+; RV64I-NEXT:  .LBB1_2: # =>This Inner Loop Header: Depth=1
+; RV64I-NEXT:    lb s0, %lo(PL_reg_match_utf8)(s2)
+; RV64I-NEXT:    beqz s0, .LBB1_1
+; RV64I-NEXT:  # %bb.3: # in Loop: Header=BB1_2 Depth=1
+; RV64I-NEXT:    mv a0, s0
+; RV64I-NEXT:    call test1
+; RV64I-NEXT:    mv a0, s0
+; RV64I-NEXT:    call test2
+; RV64I-NEXT:    mv a0, s0
+; RV64I-NEXT:    call test3
+; RV64I-NEXT:    addiw s1, s1, 1
+; RV64I-NEXT:    bnez s1, .LBB1_2
+; RV64I-NEXT:  .LBB1_4:
+; RV64I-NEXT:    li a0, 0
+; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
+; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
+; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
+; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
+; RV64I-NEXT:    addi sp, sp, 32
+; RV64I-NEXT:    ret
+  br label %1
+
+1:
+  %2 = phi i32 [ 16, %0 ], [ %12, %11 ]
+  %3 = load i8, ptr @PL_reg_match_utf8, align 1
+  %4 = icmp eq i8 %3, 0
+  br i1 %4, label %9, label %5
+
+5:
+  %6 = tail call signext i32 @test1(i8 noundef signext %3)
+  %7 = tail call signext i32 @test2(i8 noundef signext %3)
+  %8 = tail call signext i32 @test3(i8 noundef signext %3)
+  br label %11
+
+9:
+  %10 = tail call signext i32 @test2(i8 noundef signext %3)
+  br label %11
+
+11:
+  %12 = add nsw i32 %2, -1
+  %13 = icmp eq i32 %12, 0
+  br i1 %13, label %14, label %1
+
+14:
+  ret i32 0
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/73501


More information about the llvm-commits mailing list