[PATCH] D152499: [SCCP] Skip computing intrinsics if one of its args is unknownOrUndef

luxufan via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 8 23:29:13 PDT 2023


StephenFan created this revision.
StephenFan added reviewers: nikic, fhahn.
Herald added subscribers: hiraditya, kristof.beyls.
Herald added a project: All.
StephenFan requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

For constant range supported intrinsics, we got consantrange from args
no matter if they are unknown or undef. And the constant range computed
from unknown or undef value state is full range.

I think compute with full constant range is harmful since although we
can do mergeIn after these args value state are changed, the merge
operation of two constant ranges is union.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D152499

Files:
  llvm/lib/Transforms/Utils/SCCPSolver.cpp
  llvm/test/Transforms/SCCP/intrinsics.ll


Index: llvm/test/Transforms/SCCP/intrinsics.ll
===================================================================
--- llvm/test/Transforms/SCCP/intrinsics.ll
+++ llvm/test/Transforms/SCCP/intrinsics.ll
@@ -10,7 +10,7 @@
 
 define void @abs1(ptr %p) {
 ; CHECK-LABEL: @abs1(
-; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[P:%.*]], align 1, [[RNG0:!range !.*]]
+; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[P:%.*]], align 1, !range [[RNG0:![0-9]+]]
 ; CHECK-NEXT:    [[ABS:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 false)
 ; CHECK-NEXT:    call void @use(i1 true)
 ; CHECK-NEXT:    call void @use(i1 true)
@@ -62,8 +62,8 @@
 
 define void @umax1(ptr %p1, ptr %p2) {
 ; CHECK-LABEL: @umax1(
-; CHECK-NEXT:    [[X1:%.*]] = load i8, ptr [[P1:%.*]], align 1, [[RNG1:!range !.*]]
-; CHECK-NEXT:    [[X2:%.*]] = load i8, ptr [[P2:%.*]], align 1, [[RNG2:!range !.*]]
+; CHECK-NEXT:    [[X1:%.*]] = load i8, ptr [[P1:%.*]], align 1, !range [[RNG1:![0-9]+]]
+; CHECK-NEXT:    [[X2:%.*]] = load i8, ptr [[P2:%.*]], align 1, !range [[RNG2:![0-9]+]]
 ; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X1]], i8 [[X2]])
 ; CHECK-NEXT:    call void @use(i1 true)
 ; CHECK-NEXT:    call void @use(i1 true)
@@ -98,3 +98,27 @@
   call void @use(i1 %cmp)
   ret void
 }
+
+define i8 @umax_including_undef(i1 %c.1, i1 %c.2) {
+; CHECK-LABEL: @umax_including_undef(
+; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK:       true:
+; CHECK-NEXT:    br label [[EXIT:%.*]]
+; CHECK:       false:
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret i8 3
+;
+  br i1 %c.1, label %true, label %false
+
+true:
+  br label %exit
+
+false:
+  br label %exit
+
+exit:
+  %p = phi i8 [ 3, %true], [ undef, %false ]
+  %p_umax = call i8 @llvm.umax.i8(i8 %p, i8 1)
+  ret i8 %p_umax
+}
Index: llvm/lib/Transforms/Utils/SCCPSolver.cpp
===================================================================
--- llvm/lib/Transforms/Utils/SCCPSolver.cpp
+++ llvm/lib/Transforms/Utils/SCCPSolver.cpp
@@ -1758,6 +1758,8 @@
       SmallVector<ConstantRange, 2> OpRanges;
       for (Value *Op : II->args()) {
         const ValueLatticeElement &State = getValueState(Op);
+        if (State.isUnknownOrUndef())
+          return;
         OpRanges.push_back(getConstantRange(State, Op->getType()));
       }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D152499.529834.patch
Type: text/x-patch
Size: 2331 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230609/935d6858/attachment.bin>


More information about the llvm-commits mailing list