[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