[PATCH] D147041: [CodeGen] Remove redundent instructions generated by combineAddrModes.

Peter Rong via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 29 22:59:42 PDT 2023


Peter updated this revision to Diff 509552.
Peter added a comment.

move `eraseCommonValueIfDead()` as private, add comments for it.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D147041

Files:
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/test/CodeGen/X86/pr58538.ll


Index: llvm/test/CodeGen/X86/pr58538.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/pr58538.ll
@@ -0,0 +1,29 @@
+; RUN: opt -codegenprepare -mtriple=x86_64 %s -S -o - | FileCheck %s
+; RUN: opt -codegenprepare -mtriple=i386 %s -S -o - | FileCheck %s
+
+define i32 @f(i32 %0) {
+; CHECK-LABEL: @f
+; CHECK: BB:
+; CHECK:   %P0 = alloca i32, i32 8, align 4
+; CHECK:   %P1 = getelementptr i32, ptr %P0, i32 1
+; CHECK:   %1 = icmp eq i32 %0, 0
+; CHECK:   %P2 = getelementptr i1, ptr %P1, i1 %1
+; CHECK:   %2 = icmp eq i32 %0, 0
+; CHECK:   %P3 = select i1 %2, ptr %P1, ptr %P2
+; CHECK:   %L1 = load i32, ptr %P3, align 4
+; CHECK:   ret i32 %L1
+BB:
+  %P0 = alloca i32, i32 8
+  %P1 = getelementptr i32, ptr %P0, i32 1
+  %B0 = icmp eq i32 %0, 0
+  br label %BB1
+
+BB1:                                              ; preds = %BB1, %BB
+  %P2 = getelementptr i1, ptr %P1, i1 %B0
+  br i1 false, label %BB1, label %BB2
+
+BB2:                                              ; preds = %BB1
+  %P3 = select i1 %B0, ptr %P1, ptr %P2
+  %L1 = load i32, ptr %P3
+  ret i32 %L1
+}
Index: llvm/lib/CodeGen/CodeGenPrepare.cpp
===================================================================
--- llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -3559,10 +3559,15 @@
   /// Original Address.
   Value *Original;
 
+  /// Common value among addresses
+  Value *CommonValue = nullptr;
+
 public:
   AddressingModeCombiner(const SimplifyQuery &_SQ, Value *OriginalValue)
       : SQ(_SQ), Original(OriginalValue) {}
 
+  ~AddressingModeCombiner() { eraseCommonValueIfDead(); }
+
   /// Get the combined AddrMode
   const ExtAddrMode &getAddrMode() const { return AddrModes[0]; }
 
@@ -3647,13 +3652,21 @@
     if (!initializeMap(Map))
       return false;
 
-    Value *CommonValue = findCommon(Map);
+    CommonValue = findCommon(Map);
     if (CommonValue)
       AddrModes[0].SetCombinedField(DifferentField, CommonValue, AddrModes);
     return CommonValue != nullptr;
   }
 
 private:
+  /// `CommonValue` may be a placeholder inserted by us. 
+  /// If the placeholder is not used, we should remove this dead instruction.
+  void eraseCommonValueIfDead() {
+    if (CommonValue && CommonValue->getNumUses() == 0)
+      if (Instruction *CommonInst = dyn_cast<Instruction>(CommonValue))
+        CommonInst->eraseFromParent();
+  }
+
   /// Initialize Map with anchor values. For address seen
   /// we set the value of different field saw in this address.
   /// At the same time we find a common type for different field we will
@@ -5363,8 +5376,9 @@
     if (AddrMode.Scale) {
       Type *ScaledRegTy = AddrMode.ScaledReg->getType();
       if (cast<IntegerType>(IntPtrTy)->getBitWidth() >
-          cast<IntegerType>(ScaledRegTy)->getBitWidth())
+          cast<IntegerType>(ScaledRegTy)->getBitWidth()) {
         return Modified;
+      }
     }
 
     if (AddrMode.BaseGV) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D147041.509552.patch
Type: text/x-patch
Size: 2972 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230330/1e9e85d6/attachment.bin>


More information about the llvm-commits mailing list