[llvm] 3b7650d - [Pipelines] Add a test how DCE works after ArgumentPromotion
Pavel Samolysov via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 30 02:57:03 PDT 2022
Author: Pavel Samolysov
Date: 2022-06-30T12:56:08+03:00
New Revision: 3b7650da725c03b0cd1c3a9bc19d081da3bb042f
URL: https://github.com/llvm/llvm-project/commit/3b7650da725c03b0cd1c3a9bc19d081da3bb042f
DIFF: https://github.com/llvm/llvm-project/commit/3b7650da725c03b0cd1c3a9bc19d081da3bb042f.diff
LOG: [Pipelines] Add a test how DCE works after ArgumentPromotion
The ArgumentPromotion pass uses Mem2Reg promotion at the end to cutting
down generated alloca instructions as well as meaningless stores and
this behavior can leave unused (dead) arguments.
The test shows that the arguments are not removed in the current
optimization pipeline.
Added:
llvm/test/Transforms/PhaseOrdering/dce-after-argument-promotion.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/Transforms/PhaseOrdering/dce-after-argument-promotion.ll b/llvm/test/Transforms/PhaseOrdering/dce-after-argument-promotion.ll
new file mode 100644
index 0000000000000..8d0135c9566ba
--- /dev/null
+++ b/llvm/test/Transforms/PhaseOrdering/dce-after-argument-promotion.ll
@@ -0,0 +1,43 @@
+; RUN: opt -O3 -S < %s | FileCheck %s
+
+; Arg promotion eliminates the struct argument but may leave dead arguments after its work
+
+%struct.ss = type { i32, i64 }
+
+ at dummy = global i32 0
+; CHECK: [[DUMMY:@.*]] = local_unnamed_addr global i32 0
+
+define internal void @f(%struct.ss* byval(%struct.ss) align 8 %b, i32* byval(i32) align 4 %X) noinline nounwind {
+; CHECK-LABEL: define {{[^@]+}}@f
+; CHECK-SAME: (i32 [[B_0:%.*]], i32 [[X:%.*]]){{[^#]*}} #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[TEMP:%.*]] = add i32 [[B_0]], 1
+; CHECK-NEXT: store i32 [[TEMP]], i32* [[DUMMY]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %temp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0
+ %temp1 = load i32, i32* %temp, align 4
+ %temp2 = add i32 %temp1, 1
+ store i32 %temp2, i32* @dummy
+ store i32 %temp2, i32* %X
+ ret void
+}
+
+define i32 @test(i32* %X) {
+; CHECK-LABEL: define {{[^@]+}}@test
+; CHECK-SAME: (i32* {{[^%]*}} [[X:%.*]]){{[^#]*}} #[[ATTR1:[0-9]+]] {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[X_VAL:%.*]] = load i32, i32* [[X]], align 4
+; CHECK-NEXT: tail call {{.*}}void @f(i32 1, i32 [[X_VAL]])
+; CHECK-NEXT: ret i32 0
+;
+entry:
+ %S = alloca %struct.ss, align 8
+ %temp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0
+ store i32 1, i32* %temp1, align 8
+ %temp4 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1
+ store i64 2, i64* %temp4, align 4
+ call void @f( %struct.ss* byval(%struct.ss) align 8 %S, i32* byval(i32) align 4 %X)
+ ret i32 0
+}
More information about the llvm-commits
mailing list