Compiler projects using llvm
; RUN: opt < %s -disable-output -passes=indvars

; Do not timeout (and do not crash).
;
; This test case used to take around 10 minutes to run (well, that of course
; depends on which kind of build that is used and on which kind of server the
; test is executed). There is a less reduced version of this test case in
; PR51869 that takes much longer time to execute (I've not seen that one
; terminate within reasonable time). Maybe this test case is reduced a bit too
; much if being considered as a regression tests that would timeout without
; the fix. It can at least be used to show compile time explosion that
; happened when using isKnownPredicate inside ScalarEvolution::isImpliedCond.

@v_228 = external dso_local global i32, align 1

; Function Attrs: nounwind
define dso_local i16 @main(i16* %0, i16* %1, i16* %2, i16* %3, i16* %4, i16* %5, i16* %6, i16* %7, i16* %8, i16* %9, i16* %10, i1 %11) #0 {
  br i1 %11, label %27, label %13

13:                                               ; preds = %12
  %14 = load i32, i32* @v_228, align 1
  %15 = trunc i32 %14 to i16
  %16 = mul i16 %15, 2
  %17 = sub i16 10, %16
  %18 = icmp ult i16 10, %16
  %19 = icmp ult i16 %17, 1
  %20 = or i1 %18, %19
  br i1 %20, label %139, label %21

21:                                               ; preds = %13
  %22 = add i16 %16, 1
  %23 = sub i16 10, %22
  %24 = icmp ult i16 10, %22
  %25 = icmp ult i16 %23, 1
  %26 = or i1 %24, %25
  br i1 %26, label %139, label %27

27:                                               ; preds = %21, %12
  %28 = load i16, i16* %1, align 1
  br label %29

29:                                               ; preds = %29, %27
  %30 = phi i16 [ %28, %27 ], [ %31, %29 ]
  %31 = add i16 %30, 1
  %32 = icmp slt i16 %31, 28
  br i1 %32, label %29, label %33

33:                                               ; preds = %29
  %34 = load i16, i16* %2, align 1
  br label %35

35:                                               ; preds = %43, %33
  %36 = phi i16 [ %34, %33 ], [ %44, %43 ]
  %37 = sext i16 %36 to i32
  %38 = mul i32 %37, 2
  %39 = sub i32 56, %38
  %40 = icmp ult i32 56, %38
  %41 = icmp ult i32 %39, 2
  %42 = or i1 %40, %41
  br i1 %42, label %139, label %43

43:                                               ; preds = %35
  %44 = add i16 %36, 1
  %45 = icmp slt i16 %44, 28
  br i1 %45, label %35, label %46

46:                                               ; preds = %43
  %47 = load i16, i16* %3, align 1
  br label %48

48:                                               ; preds = %55, %46
  %49 = phi i16 [ %47, %46 ], [ %56, %55 ]
  %50 = mul i16 %49, 4
  %51 = sub i16 28, %50
  %52 = icmp ult i16 28, %50
  %53 = icmp ult i16 %51, 4
  %54 = or i1 %52, %53
  br i1 %54, label %139, label %55

55:                                               ; preds = %48
  %56 = add i16 %49, 1
  %57 = icmp slt i16 %56, 7
  br i1 %57, label %48, label %58

58:                                               ; preds = %55
  %59 = load i16, i16* %4, align 1
  br label %60

60:                                               ; preds = %67, %58
  %61 = phi i16 [ %59, %58 ], [ %68, %67 ]
  %62 = sext i16 %61 to i32
  %63 = sub i32 1, %62
  %64 = icmp ult i32 1, %62
  %65 = icmp ult i32 %63, 1
  %66 = or i1 %64, %65
  br i1 %66, label %139, label %67

67:                                               ; preds = %60
  %68 = add i16 %61, 1
  %69 = icmp slt i16 %68, 1
  br i1 %69, label %60, label %70

70:                                               ; preds = %67
  %71 = load i16, i16* %5, align 1
  br label %72

72:                                               ; preds = %79, %70
  %73 = phi i16 [ %71, %70 ], [ %80, %79 ]
  %74 = sext i16 %73 to i32
  %75 = sub i32 1, %74
  %76 = icmp ult i32 1, %74
  %77 = icmp ult i32 %75, 1
  %78 = or i1 %76, %77
  br i1 %78, label %139, label %79

79:                                               ; preds = %72
  %80 = add i16 %73, 1
  %81 = icmp slt i16 %80, 1
  br i1 %81, label %72, label %82

82:                                               ; preds = %79
  %83 = load i16, i16* %6, align 1
  br label %84

84:                                               ; preds = %91, %82
  %85 = phi i16 [ %83, %82 ], [ %92, %91 ]
  %86 = sext i16 %85 to i32
  %87 = sub i32 1, %86
  %88 = icmp ult i32 1, %86
  %89 = icmp ult i32 %87, 1
  %90 = or i1 %88, %89
  br i1 %90, label %139, label %91

91:                                               ; preds = %84
  %92 = add i16 %85, 1
  %93 = icmp slt i16 %92, 1
  br i1 %93, label %84, label %94

94:                                               ; preds = %91
  %95 = load i16, i16* %7, align 1
  br label %96

96:                                               ; preds = %103, %94
  %97 = phi i16 [ %95, %94 ], [ %104, %103 ]
  %98 = sext i16 %97 to i32
  %99 = sub i32 1, %98
  %100 = icmp ult i32 1, %98
  %101 = icmp ult i32 %99, 1
  %102 = or i1 %100, %101
  br i1 %102, label %139, label %103

103:                                              ; preds = %96
  %104 = add i16 %97, 1
  %105 = icmp slt i16 %104, 1
  br i1 %105, label %96, label %106

106:                                              ; preds = %103
  %107 = load i16, i16* %8, align 1
  br label %108

108:                                              ; preds = %115, %106
  %109 = phi i16 [ %107, %106 ], [ %116, %115 ]
  %110 = mul i16 %109, 4
  %111 = sub i16 24, %110
  %112 = icmp ult i16 24, %110
  %113 = icmp ult i16 %111, 4
  %114 = or i1 %112, %113
  br i1 %114, label %139, label %115

115:                                              ; preds = %108
  %116 = add i16 %109, 1
  %117 = icmp slt i16 %116, 6
  br i1 %117, label %108, label %118

118:                                              ; preds = %115
  %119 = load i16, i16* %9, align 1
  br label %120

120:                                              ; preds = %128, %118
  %121 = phi i16 [ %119, %118 ], [ %129, %128 ]
  %122 = sext i16 %121 to i32
  %123 = mul i32 %122, 2
  %124 = sub i32 4, %123
  %125 = icmp ult i32 4, %123
  %126 = icmp ult i32 %124, 2
  %127 = or i1 %125, %126
  br i1 %127, label %139, label %128

128:                                              ; preds = %120
  %129 = add i16 %121, 1
  %130 = icmp slt i16 %129, 2
  br i1 %130, label %120, label %131

131:                                              ; preds = %128
  %132 = load i16, i16* %10, align 1
  br label %133

133:                                              ; preds = %133, %131
  %134 = phi i16 [ %132, %131 ], [ %135, %133 ]
  %135 = add i16 %134, 1
  %136 = icmp slt i16 %135, 6
  br i1 %136, label %133, label %137

137:                                              ; preds = %133
  %138 = load i16, i16* %0, align 1
  ret i16 %138

139:                                              ; preds = %120, %108, %96, %84, %72, %60, %48, %35, %21, %13
  call void @llvm.trap() #2
  unreachable
}

; Function Attrs: cold noreturn nounwind
declare void @llvm.trap() #1

attributes #0 = { nounwind }
attributes #1 = { cold noreturn nounwind }
attributes #2 = { noreturn nounwind }