[llvm-branch-commits] [llvm] 40ca089 - [CodeGenPrepare] Replace deleted ext instr with the promoted value. (#71058)
Tom Stellard via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jan 31 17:50:16 PST 2025
Author: Yingwei Zheng
Date: 2025-01-31T17:49:18-08:00
New Revision: 40ca089d9930a2647b8942924f9346358339411a
URL: https://github.com/llvm/llvm-project/commit/40ca089d9930a2647b8942924f9346358339411a
DIFF: https://github.com/llvm/llvm-project/commit/40ca089d9930a2647b8942924f9346358339411a.diff
LOG: [CodeGenPrepare] Replace deleted ext instr with the promoted value. (#71058)
This PR replaces the deleted ext with the promoted value in `AddrMode`.
Fixes #70938.
(cherry picked from commit 3c6aa04cf4dee65113e2a780b9f90b36bb4c4e04)
Added:
Modified:
llvm/lib/CodeGen/CodeGenPrepare.cpp
llvm/test/CodeGen/X86/codegen-prepare-addrmode-sext.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 47486a30bba5ba..088062afab177d 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -3074,6 +3074,14 @@ struct ExtAddrMode : public TargetLowering::AddrMode {
void print(raw_ostream &OS) const;
void dump() const;
+ // Replace From in ExtAddrMode with To.
+ // E.g., SExt insts may be promoted and deleted. We should replace them with
+ // the promoted values.
+ void replaceWith(Value *From, Value *To) {
+ if (ScaledReg == From)
+ ScaledReg = To;
+ }
+
FieldName compare(const ExtAddrMode &other) {
// First check that the types are the same on each field, as
diff ering types
// is something we can't cope with later on.
@@ -5365,6 +5373,9 @@ bool AddressingModeMatcher::matchOperationAddr(User *AddrInst, unsigned Opcode,
TPT.rollback(LastKnownGood);
return false;
}
+
+ // SExt has been deleted. Make sure it is not referenced by the AddrMode.
+ AddrMode.replaceWith(Ext, PromotedOperand);
return true;
}
case Instruction::Call:
diff --git a/llvm/test/CodeGen/X86/codegen-prepare-addrmode-sext.ll b/llvm/test/CodeGen/X86/codegen-prepare-addrmode-sext.ll
index f3070cd55903bd..9755916f823789 100644
--- a/llvm/test/CodeGen/X86/codegen-prepare-addrmode-sext.ll
+++ b/llvm/test/CodeGen/X86/codegen-prepare-addrmode-sext.ll
@@ -620,3 +620,51 @@ define i8 @oneArgPromotionBlockSExtZExt(i1 %arg1, ptr %base) {
%res = load i8, ptr %arrayidx
ret i8 %res
}
+
+; Check that we replace the deleted sext with the promoted value.
+define void @pr70938(ptr %f) {
+; CHECK-LABEL: define void @pr70938(
+; CHECK-SAME: ptr [[F:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 0, 1
+; CHECK-NEXT: [[SUNKADDR:%.*]] = mul i64 [[ADD]], 2
+; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, ptr [[F]], i64 [[SUNKADDR]]
+; CHECK-NEXT: [[SUNKADDR2:%.*]] = getelementptr i8, ptr [[SUNKADDR1]], i64 1
+; CHECK-NEXT: store i8 0, ptr [[SUNKADDR2]], align 1
+; CHECK-NEXT: ret void
+;
+entry:
+ %add = add nsw i32 0, 1
+ %idxprom3 = sext i32 %add to i64
+ %arrayidx4 = getelementptr [2 x [1 x [2 x i8]]], ptr %f, i64 0, i64 %idxprom3
+ %arrayidx8 = getelementptr [2 x i8], ptr %arrayidx4, i64 0, i64 %idxprom3
+ br label %if.end
+
+if.end: ; preds = %entry
+ store i8 0, ptr %arrayidx8, align 1
+ ret void
+}
+
+define void @pr119429() {
+; CHECK-LABEL: define void @pr119429() {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[AND:%.*]] = and i64 0, 0
+; CHECK-NEXT: [[SUNKADDR:%.*]] = inttoptr i64 [[AND]] to ptr
+; CHECK-NEXT: [[SUNKADDR1:%.*]] = mul i64 [[AND]], 2
+; CHECK-NEXT: [[SUNKADDR2:%.*]] = getelementptr i8, ptr [[SUNKADDR]], i64 [[SUNKADDR1]]
+; CHECK-NEXT: store i64 0, ptr [[SUNKADDR2]], align 8
+; CHECK-NEXT: ret void
+;
+entry:
+ %and = and i32 0, 0
+ %conv1 = zext i32 %and to i64
+ %sub = add i64 %conv1, 0
+ br label %if.end
+
+if.end:
+ %mul = shl i64 %sub, 1
+ %add = add i64 %mul, %conv1
+ %ptr = inttoptr i64 %add to ptr
+ store i64 0, ptr %ptr, align 8
+ ret void
+}
More information about the llvm-branch-commits
mailing list