[llvm] 0a15942 - llvm-reduce: Fix invalid reduction for phis with repeat inputs

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 7 13:15:29 PDT 2022


Author: Matt Arsenault
Date: 2022-10-07T13:15:15-07:00
New Revision: 0a159427adf1dbc6e9ddab57fe352074b6d4a501

URL: https://github.com/llvm/llvm-project/commit/0a159427adf1dbc6e9ddab57fe352074b6d4a501
DIFF: https://github.com/llvm/llvm-project/commit/0a159427adf1dbc6e9ddab57fe352074b6d4a501.diff

LOG: llvm-reduce: Fix invalid reduction for phis with repeat inputs

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.

Added: 
    llvm/test/tools/llvm-reduce/reduce-operands-repeated-phi-input.ll

Modified: 
    llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-reduce/reduce-operands-repeated-phi-input.ll b/llvm/test/tools/llvm-reduce/reduce-operands-repeated-phi-input.ll
new file mode 100644
index 000000000000..a4dcdd0bf427
--- /dev/null
+++ b/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
+}

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp b/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
index 0dc2a348981c..773d19c27fd8 100644
--- a/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
+++ b/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
@@ -22,6 +22,17 @@ extractOperandsFromModule(Oracle &O, Module &Program,
                           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))


        


More information about the llvm-commits mailing list