[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