[PATCH] D135379: llvm-reduce: Fix invalid reduction for phis with repeat inputs
Matt Arsenault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 6 11:10:54 PDT 2022
arsenm created this revision.
arsenm added reviewers: lebedev.ri, aeubanks, fhahn, regehr.
Herald added a project: All.
arsenm requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.
Phis have a quirk where the same predecessor block may appear multiple times
if the same block branches to it multiple ways. All the values need to match,
but this was replacing each operand independently. If an operand can be simplified,
make sure to replace every instance of the incoming block's value.
https://reviews.llvm.org/D135379
Files:
llvm/test/tools/llvm-reduce/reduce-operands-repeated-phi-input.ll
llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
Index: llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
===================================================================
--- llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
+++ llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
@@ -22,6 +22,17 @@
function_ref<Value *(Use &)> ReduceValue) {
for (auto &F : Program.functions()) {
for (auto &I : instructions(&F)) {
+ if (PHINode *Phi = dyn_cast<PHINode>(&I)) {
+ for (auto &Op : Phi->incoming_values()) {
+ if (!O.shouldKeep()) {
+ if (Value *Reduced = ReduceValue(Op))
+ Phi->setIncomingValueForBlock(Phi->getIncomingBlock(Op), Reduced);
+ }
+ }
+
+ continue;
+ }
+
for (auto &Op : I.operands()) {
if (!O.shouldKeep()) {
if (Value *Reduced = ReduceValue(Op))
Index: llvm/test/tools/llvm-reduce/reduce-operands-repeated-phi-input.ll
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-reduce/reduce-operands-repeated-phi-input.ll
@@ -0,0 +1,37 @@
+; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=operands-zero --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
+; RUN: FileCheck --check-prefixes=CHECK %s < %t
+
+; Make sure if we're replacing the value in a phi, it's replaced for
+; all repeats of the same incoming block.
+
+; CHECK-INTERESTINGNESS: switch
+; CHECK-INTERESTINGNESS: phi
+; CHECK-INTERESTINGNESS-SAME: [ %arg1, %bb1 ]
+; CHECK-INTERESTINGNESS: phi
+; CHECK-INTERESTINGNESS-SAME: [ %arg3, %bb1 ]
+; CHECK-INTERESTINGNESS: store volatile i32 %
+; CHECK-INTERESTINGNESS: store volatile float %
+
+; CHECK: %phi.i32 = phi i32 [ 0, %entry ], [ 0, %entry ], [ %arg1, %bb1 ]
+; CHECK: %phi.f32 = phi float [ 0.000000e+00, %entry ], [ 0.000000e+00, %entry ], [ %arg3, %bb1 ]
+define void @foo(i32 %arg0, i32 %arg1, float %arg2, float %arg3) {
+entry:
+ switch i32 %arg0, label %ret [
+ i32 3, label %bb1
+ i32 4, label %bb2
+ i32 12, label %bb2
+ ]
+
+bb1:
+ br label %bb2
+
+bb2:
+ %phi.i32 = phi i32 [ %arg0, %entry ], [ %arg0, %entry ], [ %arg1, %bb1 ]
+ %phi.f32 = phi float [ %arg2, %entry ], [ %arg2, %entry ], [ %arg3, %bb1 ]
+ store volatile i32 %phi.i32, ptr undef
+ store volatile float %phi.f32, ptr undef
+ br label %ret
+
+ret:
+ ret void
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D135379.465794.patch
Type: text/x-patch
Size: 2403 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221006/9cced00a/attachment.bin>
More information about the llvm-commits
mailing list