[PATCH] D83257: [SCCP] Handle assume predictes

Nikita Popov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 6 13:36:18 PDT 2020


nikic created this revision.
nikic added reviewers: fhahn, efriedma.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.

Take assume predicates into account when visiting ssa.copy. The handling is the same as for branch predicates, with the difference that we're always on the true edge.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D83257

Files:
  llvm/lib/Transforms/Scalar/SCCP.cpp
  llvm/test/Transforms/SCCP/assume.ll


Index: llvm/test/Transforms/SCCP/assume.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/SCCP/assume.ll
@@ -0,0 +1,48 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -ipsccp -S | FileCheck %s
+
+declare void @use(i1)
+declare void @llvm.assume(i1)
+
+define void @basic(i32 %v) {
+; CHECK-LABEL: @basic(
+; CHECK-NEXT:    [[A1:%.*]] = icmp ult i32 [[V:%.*]], 10
+; CHECK-NEXT:    call void @llvm.assume(i1 [[A1]])
+; CHECK-NEXT:    [[A2:%.*]] = icmp ugt i32 [[V]], 5
+; CHECK-NEXT:    call void @llvm.assume(i1 [[A2]])
+; CHECK-NEXT:    call void @use(i1 true)
+; CHECK-NEXT:    [[C2:%.*]] = icmp ult i32 [[V]], 9
+; CHECK-NEXT:    call void @use(i1 [[C2]])
+; CHECK-NEXT:    call void @use(i1 false)
+; CHECK-NEXT:    [[C4:%.*]] = icmp ugt i32 [[V]], 8
+; CHECK-NEXT:    call void @use(i1 [[C4]])
+; CHECK-NEXT:    call void @use(i1 true)
+; CHECK-NEXT:    [[C6:%.*]] = icmp ugt i32 [[V]], 6
+; CHECK-NEXT:    call void @use(i1 [[C6]])
+; CHECK-NEXT:    call void @use(i1 false)
+; CHECK-NEXT:    [[C8:%.*]] = icmp ult i32 [[V]], 7
+; CHECK-NEXT:    call void @use(i1 [[C8]])
+; CHECK-NEXT:    ret void
+;
+  %a1 = icmp ult i32 %v, 10
+  call void @llvm.assume(i1 %a1)
+  %a2 = icmp ugt i32 %v, 5
+  call void @llvm.assume(i1 %a2)
+  %c1 = icmp ult i32 %v, 10
+  call void @use(i1 %c1)
+  %c2 = icmp ult i32 %v, 9
+  call void @use(i1 %c2)
+  %c3 = icmp ugt i32 %v, 9
+  call void @use(i1 %c3)
+  %c4 = icmp ugt i32 %v, 8
+  call void @use(i1 %c4)
+  %c5 = icmp ugt i32 %v, 5
+  call void @use(i1 %c5)
+  %c6 = icmp ugt i32 %v, 6
+  call void @use(i1 %c6)
+  %c7 = icmp ult i32 %v, 6
+  call void @use(i1 %c7)
+  %c8 = icmp ult i32 %v, 7
+  call void @use(i1 %c8)
+  ret void
+}
Index: llvm/lib/Transforms/Scalar/SCCP.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/SCCP.cpp
+++ llvm/lib/Transforms/Scalar/SCCP.cpp
@@ -1258,16 +1258,24 @@
         return;
 
       Value *CopyOf = CB.getOperand(0);
-      auto *PI = getPredicateInfoFor(&CB);
-      auto *PBranch = dyn_cast_or_null<PredicateBranch>(PI);
       ValueLatticeElement OriginalVal = getValueState(CopyOf);
-      if (!PI || !PBranch) {
+      auto *PI = getPredicateInfoFor(&CB);
+      assert(PI && "Missing predicate info for ssa.copy");
+
+      CmpInst *Cmp;
+      bool TrueEdge;
+      if (auto *PBranch = dyn_cast<PredicateBranch>(PI)) {
+        Cmp = dyn_cast<CmpInst>(PBranch->Condition);
+        TrueEdge = PBranch->TrueEdge;
+      } else if (auto *PAssume = dyn_cast<PredicateAssume>(PI)) {
+        Cmp = dyn_cast<CmpInst>(PAssume->Condition);
+        TrueEdge = true;
+      } else {
         mergeInValue(ValueState[&CB], &CB, OriginalVal);
         return;
       }
 
       // Everything below relies on the condition being a comparison.
-      auto *Cmp = dyn_cast<CmpInst>(PBranch->Condition);
       if (!Cmp) {
         mergeInValue(ValueState[&CB], &CB, OriginalVal);
         return;
@@ -1292,7 +1300,7 @@
         return;
       }
 
-      if (!PBranch->TrueEdge)
+      if (!TrueEdge)
         Pred = CmpInst::getInversePredicate(Pred);
 
       ValueLatticeElement CondVal = getValueState(CmpOp1);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83257.275818.patch
Type: text/x-patch
Size: 3254 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200706/916769ff/attachment.bin>


More information about the llvm-commits mailing list