[llvm] r310481 - [ValueTracking] Honour recursion limit.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 9 08:13:50 PDT 2017


Author: davide
Date: Wed Aug  9 08:13:50 2017
New Revision: 310481

URL: http://llvm.org/viewvc/llvm-project?rev=310481&view=rev
Log:
[ValueTracking] Honour recursion limit.

The recently improved support for `icmp` in ValueTracking
(r307304) exposes the fact that `isImplied` condition doesn't
really bail out if we hit the recursion limit (and calls
`computeKnownBits` which increases the depth and asserts).

Differential Revision:  https://reviews.llvm.org/D36512

Added:
    llvm/trunk/test/Transforms/SimplifyCFG/pr34131.ll
Modified:
    llvm/trunk/lib/Analysis/ValueTracking.cpp

Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=310481&r1=310480&r2=310481&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Wed Aug  9 08:13:50 2017
@@ -4556,6 +4556,10 @@ static Optional<bool> isImpliedCondAndOr
 Optional<bool> llvm::isImpliedCondition(const Value *LHS, const Value *RHS,
                                         const DataLayout &DL, bool LHSIsTrue,
                                         unsigned Depth) {
+  // Bail out when we hit the limit.
+  if (Depth == MaxDepth)
+    return None;
+
   // A mismatch occurs when we compare a scalar cmp to a vector cmp, for
   // example.
   if (LHS->getType() != RHS->getType())

Added: llvm/trunk/test/Transforms/SimplifyCFG/pr34131.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/pr34131.ll?rev=310481&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/pr34131.ll (added)
+++ llvm/trunk/test/Transforms/SimplifyCFG/pr34131.ll Wed Aug  9 08:13:50 2017
@@ -0,0 +1,116 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -simplifycfg %s -S | FileCheck %s
+
+define void @patatino() {
+; CHECK-LABEL: @patatino(
+; CHECK-NEXT:    br label [[BB1:%.*]]
+; CHECK:       bb1:
+; CHECK-NEXT:    br i1 undef, label [[BB4:%.*]], label [[BB9_CRITEDGE:%.*]]
+; CHECK:       bb4:
+; CHECK-NEXT:    [[DOTPR:%.*]] = phi i1 [ undef, [[BB4]] ], [ true, [[BB1]] ]
+; CHECK-NEXT:    br i1 [[DOTPR]], label [[BB4]], label [[BB6:%.*]]
+; CHECK:       bb6:
+; CHECK-NEXT:    [[TMP:%.*]] = or i64 undef, 1
+; CHECK-NEXT:    [[TMP8:%.*]] = icmp ult i64 [[TMP]], 0
+; CHECK-NEXT:    [[OR_COND:%.*]] = and i1 undef, [[TMP8]]
+; CHECK-NEXT:    [[TMP13:%.*]] = icmp ult i64 0, 0
+; CHECK-NEXT:    [[OR_COND2:%.*]] = and i1 [[OR_COND]], [[TMP13]]
+; CHECK-NEXT:    [[TMP15:%.*]] = icmp ult i64 undef, 0
+; CHECK-NEXT:    [[OR_COND3:%.*]] = and i1 [[OR_COND2]], [[TMP15]]
+; CHECK-NEXT:    [[TMP19:%.*]] = or i64 undef, 5
+; CHECK-NEXT:    [[TMP20:%.*]] = icmp ult i64 [[TMP19]], 0
+; CHECK-NEXT:    [[OR_COND4:%.*]] = and i1 [[OR_COND3]], [[TMP20]]
+; CHECK-NEXT:    [[TMP22:%.*]] = or i64 undef, 6
+; CHECK-NEXT:    [[TMP23:%.*]] = icmp ult i64 [[TMP22]], 0
+; CHECK-NEXT:    [[OR_COND5:%.*]] = and i1 [[OR_COND4]], [[TMP23]]
+; CHECK-NEXT:    [[TMP25:%.*]] = or i64 undef, 7
+; CHECK-NEXT:    [[TMP26:%.*]] = icmp ult i64 [[TMP25]], 0
+; CHECK-NEXT:    [[OR_COND6:%.*]] = and i1 [[OR_COND5]], [[TMP26]]
+; CHECK-NEXT:    [[TMP28:%.*]] = or i64 undef, 8
+; CHECK-NEXT:    [[TMP29:%.*]] = icmp ult i64 [[TMP28]], 0
+; CHECK-NEXT:    [[OR_COND7:%.*]] = and i1 [[OR_COND6]], [[TMP29]]
+; CHECK-NEXT:    [[OR_COND7_NOT:%.*]] = xor i1 [[OR_COND7]], true
+; CHECK-NEXT:    [[DOTNOT:%.*]] = xor i1 undef, true
+; CHECK-NEXT:    [[BRMERGE:%.*]] = or i1 [[OR_COND7_NOT]], [[DOTNOT]]
+; CHECK-NEXT:    [[DOTNOT8:%.*]] = xor i1 undef, true
+; CHECK-NEXT:    [[BRMERGE9:%.*]] = or i1 [[BRMERGE]], [[DOTNOT8]]
+; CHECK-NEXT:    [[DOTNOT10:%.*]] = xor i1 undef, true
+; CHECK-NEXT:    [[BRMERGE11:%.*]] = or i1 [[BRMERGE9]], [[DOTNOT10]]
+; CHECK-NEXT:    [[DOTNOT12:%.*]] = xor i1 undef, true
+; CHECK-NEXT:    [[BRMERGE13:%.*]] = or i1 [[BRMERGE11]], [[DOTNOT12]]
+; CHECK-NEXT:    [[DOTNOT14:%.*]] = xor i1 undef, true
+; CHECK-NEXT:    [[BRMERGE15:%.*]] = or i1 [[BRMERGE13]], [[DOTNOT14]]
+; CHECK-NEXT:    [[DOTNOT16:%.*]] = xor i1 undef, true
+; CHECK-NEXT:    [[BRMERGE17:%.*]] = or i1 [[BRMERGE15]], [[DOTNOT16]]
+; CHECK-NEXT:    [[DOTNOT18:%.*]] = xor i1 undef, true
+; CHECK-NEXT:    [[BRMERGE19:%.*]] = or i1 [[BRMERGE17]], [[DOTNOT18]]
+; CHECK-NEXT:    br i1 [[BRMERGE19]], label [[BB11:%.*]], label [[BB1]]
+; CHECK:       bb9.critedge:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb11:
+; CHECK-NEXT:    ret void
+;
+  br label %bb1
+bb1:                                              ; preds = %bb36, %0
+  br label %bb2
+bb2:                                              ; preds = %bb3, %bb1
+  br i1 undef, label %bb4, label %bb3
+bb3:                                              ; preds = %bb4, %bb2
+  br i1 undef, label %bb2, label %bb5
+bb4:                                              ; preds = %bb2
+  switch i32 undef, label %bb3 [
+  ]
+bb5:                                              ; preds = %bb3
+  br label %bb6
+bb6:                                              ; preds = %bb5
+  br i1 undef, label %bb7, label %bb9
+bb7:                                              ; preds = %bb6
+  %tmp = or i64 undef, 1
+  %tmp8 = icmp ult i64 %tmp, 0
+  br i1 %tmp8, label %bb12, label %bb9
+bb9:                                              ; preds = %bb35, %bb34, %bb33, %bb32, %bb31, %bb30, %bb27, %bb24, %bb21, %bb18, %bb16, %bb14, %bb12, %bb7, %bb6
+  br label %bb11
+bb10:                                             ; preds = %bb36
+  br label %bb11
+bb11:                                             ; preds = %bb10, %bb9
+  ret void
+bb12:                                             ; preds = %bb7
+  %tmp13 = icmp ult i64 0, 0
+  br i1 %tmp13, label %bb14, label %bb9
+bb14:                                             ; preds = %bb12
+  %tmp15 = icmp ult i64 undef, 0
+  br i1 %tmp15, label %bb16, label %bb9
+bb16:                                             ; preds = %bb14
+  %tmp17 = icmp ult i64 undef, 0
+  br i1 %tmp17, label %bb18, label %bb9
+bb18:                                             ; preds = %bb16
+  %tmp19 = or i64 undef, 5
+  %tmp20 = icmp ult i64 %tmp19, 0
+  br i1 %tmp20, label %bb21, label %bb9
+bb21:                                             ; preds = %bb18
+  %tmp22 = or i64 undef, 6
+  %tmp23 = icmp ult i64 %tmp22, 0
+  br i1 %tmp23, label %bb24, label %bb9
+bb24:                                             ; preds = %bb21
+  %tmp25 = or i64 undef, 7
+  %tmp26 = icmp ult i64 %tmp25, 0
+  br i1 %tmp26, label %bb27, label %bb9
+bb27:                                             ; preds = %bb24
+  %tmp28 = or i64 undef, 8
+  %tmp29 = icmp ult i64 %tmp28, 0
+  br i1 %tmp29, label %bb30, label %bb9
+bb30:                                             ; preds = %bb27
+  br i1 undef, label %bb31, label %bb9
+bb31:                                             ; preds = %bb30
+  br i1 undef, label %bb32, label %bb9
+bb32:                                             ; preds = %bb31
+  br i1 undef, label %bb33, label %bb9
+bb33:                                             ; preds = %bb32
+  br i1 undef, label %bb34, label %bb9
+bb34:                                             ; preds = %bb33
+  br i1 undef, label %bb35, label %bb9
+bb35:                                             ; preds = %bb34
+  br i1 undef, label %bb36, label %bb9
+bb36:                                             ; preds = %bb35
+  br i1 undef, label %bb1, label %bb10
+}




More information about the llvm-commits mailing list