switch a couple of SCEV tests to autogen for ease of update
This commit is contained in:
		
							parent
							
								
									b759381b75
								
							
						
					
					
						commit
						a92f11b682
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
 | 
			
		||||
; RUN: opt < %s -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
 | 
			
		||||
 | 
			
		||||
; ScalarEvolution should be able to fold away the sign-extensions
 | 
			
		||||
| 
						 | 
				
			
			@ -7,7 +8,48 @@
 | 
			
		|||
 | 
			
		||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
 | 
			
		||||
 | 
			
		||||
; Note: Without the preheader assume, there is an 'smax' in the
 | 
			
		||||
; backedge-taken count expression:
 | 
			
		||||
define void @foo(i32 %no, double* nocapture %d, double* nocapture %q) nounwind {
 | 
			
		||||
; CHECK-LABEL: 'foo'
 | 
			
		||||
; CHECK-NEXT:  Classifying expressions for: @foo
 | 
			
		||||
; CHECK-NEXT:    %n = and i32 %no, -2
 | 
			
		||||
; CHECK-NEXT:    --> (2 * (%no /u 2))<nuw> U: [0,-1) S: [-2147483648,2147483647)
 | 
			
		||||
; CHECK-NEXT:    %i.01 = phi i32 [ %16, %bb1 ], [ 0, %bb.nph ]
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%bb> U: [0,2147483645) S: [0,2147483645) Exits: (2 * ((-1 + (2 * (%no /u 2))<nuw>) /u 2))<nuw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %1 = sext i32 %i.01 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%bb> U: [0,2147483645) S: [0,2147483645) Exits: (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %2 = getelementptr inbounds double, double* %d, i64 %1
 | 
			
		||||
; CHECK-NEXT:    --> {%d,+,16}<nuw><%bb> U: full-set S: full-set Exits: ((16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %d) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %4 = sext i32 %i.01 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%bb> U: [0,2147483645) S: [0,2147483645) Exits: (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %5 = getelementptr inbounds double, double* %q, i64 %4
 | 
			
		||||
; CHECK-NEXT:    --> {%q,+,16}<nuw><%bb> U: full-set S: full-set Exits: ((16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %q) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %7 = or i32 %i.01, 1
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%bb> U: [1,2147483646) S: [1,2147483646) Exits: (1 + (2 * ((-1 + (2 * (%no /u 2))<nuw>) /u 2))<nuw>)<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %8 = sext i32 %7 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%bb> U: [1,2147483646) S: [1,2147483646) Exits: (1 + (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw>)<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %9 = getelementptr inbounds double, double* %q, i64 %8
 | 
			
		||||
; CHECK-NEXT:    --> {(8 + %q)<nuw>,+,16}<nuw><%bb> U: [8,0) S: [8,0) Exits: (8 + (16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %q) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %t7 = add nsw i32 %i.01, 1
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%bb> U: [1,2147483646) S: [1,2147483646) Exits: (1 + (2 * ((-1 + (2 * (%no /u 2))<nuw>) /u 2))<nuw>)<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %t8 = sext i32 %t7 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%bb> U: [1,2147483646) S: [1,2147483646) Exits: (1 + (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw>)<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %t9 = getelementptr inbounds double, double* %q, i64 %t8
 | 
			
		||||
; CHECK-NEXT:    --> {(8 + %q)<nuw>,+,16}<nuw><%bb> U: [8,0) S: [8,0) Exits: (8 + (16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %q) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %14 = sext i32 %i.01 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%bb> U: [0,2147483645) S: [0,2147483645) Exits: (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %15 = getelementptr inbounds double, double* %d, i64 %14
 | 
			
		||||
; CHECK-NEXT:    --> {%d,+,16}<nuw><%bb> U: full-set S: full-set Exits: ((16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %d) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %16 = add nsw i32 %i.01, 2
 | 
			
		||||
; CHECK-NEXT:    --> {2,+,2}<nuw><nsw><%bb> U: [2,2147483647) S: [2,2147483647) Exits: (2 + (2 * ((-1 + (2 * (%no /u 2))<nuw>) /u 2))<nuw>) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:  Determining loop execution counts for: @foo
 | 
			
		||||
; CHECK-NEXT:  Loop %bb: backedge-taken count is ((-1 + (2 * (%no /u 2))<nuw>) /u 2)
 | 
			
		||||
; CHECK-NEXT:  Loop %bb: max backedge-taken count is 1073741822
 | 
			
		||||
; CHECK-NEXT:  Loop %bb: Predicated backedge-taken count is ((-1 + (2 * (%no /u 2))<nuw>) /u 2)
 | 
			
		||||
; CHECK-NEXT:   Predicates:
 | 
			
		||||
; CHECK:       Loop %bb: Trip multiple is 1
 | 
			
		||||
;
 | 
			
		||||
entry:
 | 
			
		||||
  %n = and i32 %no, 4294967294
 | 
			
		||||
  %0 = icmp sgt i32 %n, 0                         ; <i1> [#uses=1]
 | 
			
		||||
| 
						 | 
				
			
			@ -20,12 +62,8 @@ bb.nph:                                           ; preds = %entry
 | 
			
		|||
bb:                                               ; preds = %bb.nph, %bb1
 | 
			
		||||
  %i.01 = phi i32 [ %16, %bb1 ], [ 0, %bb.nph ]   ; <i32> [#uses=5]
 | 
			
		||||
 | 
			
		||||
; CHECK: %1 = sext i32 %i.01 to i64
 | 
			
		||||
; CHECK: -->  {0,+,2}<nuw><nsw><%bb>
 | 
			
		||||
  %1 = sext i32 %i.01 to i64                      ; <i64> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %2 = getelementptr inbounds double, double* %d, i64 %1
 | 
			
		||||
; CHECK: -->  {%d,+,16}<nuw><%bb>
 | 
			
		||||
  %2 = getelementptr inbounds double, double* %d, i64 %1  ; <double*> [#uses=1]
 | 
			
		||||
 | 
			
		||||
  %3 = load double, double* %2, align 8                   ; <double> [#uses=1]
 | 
			
		||||
| 
						 | 
				
			
			@ -34,24 +72,16 @@ bb:                                               ; preds = %bb.nph, %bb1
 | 
			
		|||
  %6 = load double, double* %5, align 8                   ; <double> [#uses=1]
 | 
			
		||||
  %7 = or i32 %i.01, 1                            ; <i32> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %8 = sext i32 %7 to i64
 | 
			
		||||
; CHECK: -->  {1,+,2}<nuw><nsw><%bb>
 | 
			
		||||
  %8 = sext i32 %7 to i64                         ; <i64> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %9 = getelementptr inbounds double, double* %q, i64 %8
 | 
			
		||||
; CHECK: {(8 + %q)<nuw>,+,16}<nuw><%bb>
 | 
			
		||||
  %9 = getelementptr inbounds double, double* %q, i64 %8  ; <double*> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; Artificially repeat the above three instructions, this time using
 | 
			
		||||
; add nsw instead of or.
 | 
			
		||||
  %t7 = add nsw i32 %i.01, 1                            ; <i32> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %t8 = sext i32 %t7 to i64
 | 
			
		||||
; CHECK: -->  {1,+,2}<nuw><nsw><%bb>
 | 
			
		||||
  %t8 = sext i32 %t7 to i64                         ; <i64> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %t9 = getelementptr inbounds double, double* %q, i64 %t8
 | 
			
		||||
; CHECK: {(8 + %q)<nuw>,+,16}<nuw><%bb>
 | 
			
		||||
  %t9 = getelementptr inbounds double, double* %q, i64 %t8  ; <double*> [#uses=1]
 | 
			
		||||
 | 
			
		||||
  %10 = load double, double* %9, align 8                  ; <double> [#uses=1]
 | 
			
		||||
| 
						 | 
				
			
			@ -76,8 +106,3 @@ return:                                           ; preds = %bb1.return_crit_edg
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
declare void @llvm.assume(i1) nounwind
 | 
			
		||||
 | 
			
		||||
; Note: Without the preheader assume, there is an 'smax' in the
 | 
			
		||||
; backedge-taken count expression:
 | 
			
		||||
; CHECK: Loop %bb: backedge-taken count is ((-1 + (2 * (%no /u 2))<nuw>) /u 2)
 | 
			
		||||
; CHECK: Loop %bb: max backedge-taken count is 1073741822
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
 | 
			
		||||
; RUN: opt < %s -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
 | 
			
		||||
 | 
			
		||||
; ScalarEvolution should be able to fold away the sign-extensions
 | 
			
		||||
| 
						 | 
				
			
			@ -7,6 +8,45 @@
 | 
			
		|||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
 | 
			
		||||
 | 
			
		||||
define void @foo(i32 %no, double* nocapture %d, double* nocapture %q) nounwind {
 | 
			
		||||
; CHECK-LABEL: 'foo'
 | 
			
		||||
; CHECK-NEXT:  Classifying expressions for: @foo
 | 
			
		||||
; CHECK-NEXT:    %n = and i32 %no, -2
 | 
			
		||||
; CHECK-NEXT:    --> (2 * (%no /u 2))<nuw> U: [0,-1) S: [-2147483648,2147483647)
 | 
			
		||||
; CHECK-NEXT:    %i.01 = phi i32 [ %16, %bb1 ], [ 0, %bb.nph ]
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%bb> U: [0,2147483645) S: [0,2147483645) Exits: (2 * ((-1 + (2 * (%no /u 2))<nuw>) /u 2))<nuw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %1 = sext i32 %i.01 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%bb> U: [0,2147483645) S: [0,2147483645) Exits: (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %2 = getelementptr inbounds double, double* %d, i64 %1
 | 
			
		||||
; CHECK-NEXT:    --> {%d,+,16}<nuw><%bb> U: full-set S: full-set Exits: ((16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %d) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %4 = sext i32 %i.01 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%bb> U: [0,2147483645) S: [0,2147483645) Exits: (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %5 = getelementptr inbounds double, double* %q, i64 %4
 | 
			
		||||
; CHECK-NEXT:    --> {%q,+,16}<nuw><%bb> U: full-set S: full-set Exits: ((16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %q) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %7 = or i32 %i.01, 1
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%bb> U: [1,2147483646) S: [1,2147483646) Exits: (1 + (2 * ((-1 + (2 * (%no /u 2))<nuw>) /u 2))<nuw>)<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %8 = sext i32 %7 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%bb> U: [1,2147483646) S: [1,2147483646) Exits: (1 + (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw>)<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %9 = getelementptr inbounds double, double* %q, i64 %8
 | 
			
		||||
; CHECK-NEXT:    --> {(8 + %q)<nuw>,+,16}<nuw><%bb> U: [8,0) S: [8,0) Exits: (8 + (16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %q) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %t7 = add nsw i32 %i.01, 1
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%bb> U: [1,2147483646) S: [1,2147483646) Exits: (1 + (2 * ((-1 + (2 * (%no /u 2))<nuw>) /u 2))<nuw>)<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %t8 = sext i32 %t7 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%bb> U: [1,2147483646) S: [1,2147483646) Exits: (1 + (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw>)<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %t9 = getelementptr inbounds double, double* %q, i64 %t8
 | 
			
		||||
; CHECK-NEXT:    --> {(8 + %q)<nuw>,+,16}<nuw><%bb> U: [8,0) S: [8,0) Exits: (8 + (16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %q) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %14 = sext i32 %i.01 to i64
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%bb> U: [0,2147483645) S: [0,2147483645) Exits: (2 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %15 = getelementptr inbounds double, double* %d, i64 %14
 | 
			
		||||
; CHECK-NEXT:    --> {%d,+,16}<nuw><%bb> U: full-set S: full-set Exits: ((16 * ((1 + (zext i32 (-2 + (2 * (%no /u 2))<nuw>) to i64))<nuw><nsw> /u 2))<nuw><nsw> + %d) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:    %16 = add nsw i32 %i.01, 2
 | 
			
		||||
; CHECK-NEXT:    --> {2,+,2}<nuw><nsw><%bb> U: [2,2147483647) S: [2,2147483647) Exits: (2 + (2 * ((-1 + (2 * (%no /u 2))<nuw>) /u 2))<nuw>) LoopDispositions: { %bb: Computable }
 | 
			
		||||
; CHECK-NEXT:  Determining loop execution counts for: @foo
 | 
			
		||||
; CHECK-NEXT:  Loop %bb: backedge-taken count is ((-1 + (2 * (%no /u 2))<nuw>) /u 2)
 | 
			
		||||
; CHECK-NEXT:  Loop %bb: max backedge-taken count is 1073741822
 | 
			
		||||
; CHECK-NEXT:  Loop %bb: Predicated backedge-taken count is ((-1 + (2 * (%no /u 2))<nuw>) /u 2)
 | 
			
		||||
; CHECK-NEXT:   Predicates:
 | 
			
		||||
; CHECK:       Loop %bb: Trip multiple is 1
 | 
			
		||||
;
 | 
			
		||||
entry:
 | 
			
		||||
  %n = and i32 %no, 4294967294
 | 
			
		||||
  %0 = icmp sgt i32 %n, 0                         ; <i1> [#uses=1]
 | 
			
		||||
| 
						 | 
				
			
			@ -18,12 +58,8 @@ bb.nph:                                           ; preds = %entry
 | 
			
		|||
bb:                                               ; preds = %bb.nph, %bb1
 | 
			
		||||
  %i.01 = phi i32 [ %16, %bb1 ], [ 0, %bb.nph ]   ; <i32> [#uses=5]
 | 
			
		||||
 | 
			
		||||
; CHECK: %1 = sext i32 %i.01 to i64
 | 
			
		||||
; CHECK: -->  {0,+,2}<nuw><nsw><%bb>
 | 
			
		||||
  %1 = sext i32 %i.01 to i64                      ; <i64> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %2 = getelementptr inbounds double, double* %d, i64 %1
 | 
			
		||||
; CHECK: -->  {%d,+,16}<nuw><%bb>
 | 
			
		||||
  %2 = getelementptr inbounds double, double* %d, i64 %1  ; <double*> [#uses=1]
 | 
			
		||||
 | 
			
		||||
  %3 = load double, double* %2, align 8                   ; <double> [#uses=1]
 | 
			
		||||
| 
						 | 
				
			
			@ -32,24 +68,16 @@ bb:                                               ; preds = %bb.nph, %bb1
 | 
			
		|||
  %6 = load double, double* %5, align 8                   ; <double> [#uses=1]
 | 
			
		||||
  %7 = or i32 %i.01, 1                            ; <i32> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %8 = sext i32 %7 to i64
 | 
			
		||||
; CHECK: -->  {1,+,2}<nuw><nsw><%bb>
 | 
			
		||||
  %8 = sext i32 %7 to i64                         ; <i64> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %9 = getelementptr inbounds double, double* %q, i64 %8
 | 
			
		||||
; CHECK: {(8 + %q)<nuw>,+,16}<nuw><%bb>
 | 
			
		||||
  %9 = getelementptr inbounds double, double* %q, i64 %8  ; <double*> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; Artificially repeat the above three instructions, this time using
 | 
			
		||||
; add nsw instead of or.
 | 
			
		||||
  %t7 = add nsw i32 %i.01, 1                            ; <i32> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %t8 = sext i32 %t7 to i64
 | 
			
		||||
; CHECK: -->  {1,+,2}<nuw><nsw><%bb>
 | 
			
		||||
  %t8 = sext i32 %t7 to i64                         ; <i64> [#uses=1]
 | 
			
		||||
 | 
			
		||||
; CHECK: %t9 = getelementptr inbounds double, double* %q, i64 %t8
 | 
			
		||||
; CHECK: {(8 + %q)<nuw>,+,16}<nuw><%bb>
 | 
			
		||||
  %t9 = getelementptr inbounds double, double* %q, i64 %t8  ; <double*> [#uses=1]
 | 
			
		||||
 | 
			
		||||
  %10 = load double, double* %9, align 8                  ; <double> [#uses=1]
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +100,3 @@ bb1.return_crit_edge:                             ; preds = %bb1
 | 
			
		|||
return:                                           ; preds = %bb1.return_crit_edge, %entry
 | 
			
		||||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK: Loop %bb: backedge-taken count is ((-1 + (2 * (%no /u 2))<nuw>) /u 2)
 | 
			
		||||
; CHECK: Loop %bb: max backedge-taken count is 1073741822
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,25 @@
 | 
			
		|||
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
 | 
			
		||||
; RUN: opt < %s -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
 | 
			
		||||
 | 
			
		||||
; copied from flags-from-poison.ll
 | 
			
		||||
; CHECK-LABEL: @test-add-nuw
 | 
			
		||||
; CHECK: -->  {(1 + %offset)<nuw>,+,1}<nuw><%loop> U: [1,0) S: [1,0)
 | 
			
		||||
define void @test-add-nuw(float* %input, i32 %offset, i32 %numIterations) {
 | 
			
		||||
; CHECK-LABEL: 'test-add-nuw'
 | 
			
		||||
; CHECK-NEXT:  Classifying expressions for: @test-add-nuw
 | 
			
		||||
; CHECK-NEXT:    %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,1}<nuw><%loop> U: full-set S: full-set Exits: (-1 + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %nexti = add nuw i32 %i, 1
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,1}<nuw><%loop> U: [1,0) S: [1,0) Exits: %numIterations LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %index32 = add nuw i32 %nexti, %offset
 | 
			
		||||
; CHECK-NEXT:    --> {(1 + %offset)<nuw>,+,1}<nuw><%loop> U: [1,0) S: [1,0) Exits: (%offset + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %ptr = getelementptr inbounds float, float* %input, i32 %index32
 | 
			
		||||
; CHECK-NEXT:    --> ((4 * (sext i32 {(1 + %offset)<nuw>,+,1}<nuw><%loop> to i64))<nsw> + %input) U: full-set S: full-set Exits: ((4 * (sext i32 (%offset + %numIterations) to i64))<nsw> + %input) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:  Determining loop execution counts for: @test-add-nuw
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %numIterations)
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (-1 + %numIterations)
 | 
			
		||||
; CHECK-NEXT:   Predicates:
 | 
			
		||||
; CHECK:       Loop %loop: Trip multiple is 1
 | 
			
		||||
;
 | 
			
		||||
entry:
 | 
			
		||||
  br label %loop
 | 
			
		||||
loop:
 | 
			
		||||
| 
						 | 
				
			
			@ -19,9 +35,26 @@ exit:
 | 
			
		|||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK-LABEL: @test-addrec-nuw
 | 
			
		||||
; CHECK: -->  {(1 + (10 smax %offset))<nuw>,+,1}<nuw><%loop> U: [11,0) S: [11,0)
 | 
			
		||||
define void @test-addrec-nuw(float* %input, i32 %offset, i32 %numIterations) {
 | 
			
		||||
; CHECK-LABEL: 'test-addrec-nuw'
 | 
			
		||||
; CHECK-NEXT:  Classifying expressions for: @test-addrec-nuw
 | 
			
		||||
; CHECK-NEXT:    %min.10 = select i1 %cmp, i32 %offset, i32 10
 | 
			
		||||
; CHECK-NEXT:    --> (10 smax %offset) U: [10,-2147483648) S: [10,-2147483648)
 | 
			
		||||
; CHECK-NEXT:    %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,1}<nuw><%loop> U: full-set S: full-set Exits: (-1 + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %nexti = add nuw i32 %i, 1
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,1}<nuw><%loop> U: [1,0) S: [1,0) Exits: %numIterations LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %index32 = add nuw i32 %nexti, %min.10
 | 
			
		||||
; CHECK-NEXT:    --> {(1 + (10 smax %offset))<nuw>,+,1}<nuw><%loop> U: [11,0) S: [11,0) Exits: ((10 smax %offset) + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %ptr = getelementptr inbounds float, float* %input, i32 %index32
 | 
			
		||||
; CHECK-NEXT:    --> ((4 * (sext i32 {(1 + (10 smax %offset))<nuw>,+,1}<nuw><%loop> to i64))<nsw> + %input) U: full-set S: full-set Exits: ((4 * (sext i32 ((10 smax %offset) + %numIterations) to i64))<nsw> + %input) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:  Determining loop execution counts for: @test-addrec-nuw
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %numIterations)
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (-1 + %numIterations)
 | 
			
		||||
; CHECK-NEXT:   Predicates:
 | 
			
		||||
; CHECK:       Loop %loop: Trip multiple is 1
 | 
			
		||||
;
 | 
			
		||||
entry:
 | 
			
		||||
  %cmp = icmp sgt i32 %offset, 10
 | 
			
		||||
  %min.10 = select i1 %cmp, i32 %offset, i32 10
 | 
			
		||||
| 
						 | 
				
			
			@ -39,9 +72,26 @@ exit:
 | 
			
		|||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK-LABEL: @test-addrec-nsw-start-neg-strip-neg
 | 
			
		||||
; CHECK: -->  {(-1 + (-10 smin %offset))<nsw>,+,-1}<nsw><%loop> U: [-2147483648,-10) S: [-2147483648,-10)
 | 
			
		||||
define void @test-addrec-nsw-start-neg-strip-neg(float* %input, i32 %offset, i32 %numIterations) {
 | 
			
		||||
; CHECK-LABEL: 'test-addrec-nsw-start-neg-strip-neg'
 | 
			
		||||
; CHECK-NEXT:  Classifying expressions for: @test-addrec-nsw-start-neg-strip-neg
 | 
			
		||||
; CHECK-NEXT:    %max = select i1 %cmp, i32 %offset, i32 -10
 | 
			
		||||
; CHECK-NEXT:    --> (-10 smin %offset) U: [-2147483648,-9) S: [-2147483648,-9)
 | 
			
		||||
; CHECK-NEXT:    %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,-1}<nsw><%loop> U: [-2147483648,1) S: [-2147483648,1) Exits: (1 + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %nexti = add nsw i32 %i, -1
 | 
			
		||||
; CHECK-NEXT:    --> {-1,+,-1}<nsw><%loop> U: [-2147483648,0) S: [-2147483648,0) Exits: %numIterations LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %index32 = add nsw i32 %nexti, %max
 | 
			
		||||
; CHECK-NEXT:    --> {(-1 + (-10 smin %offset))<nsw>,+,-1}<nsw><%loop> U: [-2147483648,-10) S: [-2147483648,-10) Exits: ((-10 smin %offset) + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %ptr = getelementptr inbounds float, float* %input, i32 %index32
 | 
			
		||||
; CHECK-NEXT:    --> {(-4 + (4 * (sext i32 (-10 smin %offset) to i64))<nsw> + %input),+,-4}<nw><%loop> U: full-set S: full-set Exits: (-4 + (4 * (sext i32 (-10 smin %offset) to i64))<nsw> + (-4 * (zext i32 (-1 + (-1 * %numIterations)) to i64))<nsw> + %input) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:  Determining loop execution counts for: @test-addrec-nsw-start-neg-strip-neg
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + (-1 * %numIterations))
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (-1 + (-1 * %numIterations))
 | 
			
		||||
; CHECK-NEXT:   Predicates:
 | 
			
		||||
; CHECK:       Loop %loop: Trip multiple is 1
 | 
			
		||||
;
 | 
			
		||||
entry:
 | 
			
		||||
  %cmp = icmp slt i32 %offset, -10
 | 
			
		||||
  %max = select i1 %cmp, i32 %offset, i32 -10
 | 
			
		||||
| 
						 | 
				
			
			@ -59,9 +109,26 @@ exit:
 | 
			
		|||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK-LABEL: @test-addrec-nsw-start-pos-strip-neg
 | 
			
		||||
; CHECK: -->  {(-1 + (10 smin %offset))<nsw>,+,-1}<nsw><%loop> U: [-2147483648,10) S: [-2147483648,10)
 | 
			
		||||
define void @test-addrec-nsw-start-pos-strip-neg(float* %input, i32 %offset, i32 %numIterations) {
 | 
			
		||||
; CHECK-LABEL: 'test-addrec-nsw-start-pos-strip-neg'
 | 
			
		||||
; CHECK-NEXT:  Classifying expressions for: @test-addrec-nsw-start-pos-strip-neg
 | 
			
		||||
; CHECK-NEXT:    %max = select i1 %cmp, i32 %offset, i32 10
 | 
			
		||||
; CHECK-NEXT:    --> (10 smin %offset) U: [-2147483648,11) S: [-2147483648,11)
 | 
			
		||||
; CHECK-NEXT:    %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,-1}<nsw><%loop> U: [-2147483648,1) S: [-2147483648,1) Exits: (1 + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %nexti = add nsw i32 %i, -1
 | 
			
		||||
; CHECK-NEXT:    --> {-1,+,-1}<nsw><%loop> U: [-2147483648,0) S: [-2147483648,0) Exits: %numIterations LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %index32 = add nsw i32 %nexti, %max
 | 
			
		||||
; CHECK-NEXT:    --> {(-1 + (10 smin %offset))<nsw>,+,-1}<nsw><%loop> U: [-2147483648,10) S: [-2147483648,10) Exits: ((10 smin %offset) + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %ptr = getelementptr inbounds float, float* %input, i32 %index32
 | 
			
		||||
; CHECK-NEXT:    --> {(-4 + (4 * (sext i32 (10 smin %offset) to i64))<nsw> + %input),+,-4}<nw><%loop> U: full-set S: full-set Exits: (-4 + (4 * (sext i32 (10 smin %offset) to i64))<nsw> + (-4 * (zext i32 (-1 + (-1 * %numIterations)) to i64))<nsw> + %input) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:  Determining loop execution counts for: @test-addrec-nsw-start-pos-strip-neg
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + (-1 * %numIterations))
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (-1 + (-1 * %numIterations))
 | 
			
		||||
; CHECK-NEXT:   Predicates:
 | 
			
		||||
; CHECK:       Loop %loop: Trip multiple is 1
 | 
			
		||||
;
 | 
			
		||||
entry:
 | 
			
		||||
  %cmp = icmp slt i32 %offset, 10
 | 
			
		||||
  %max = select i1 %cmp, i32 %offset, i32  10
 | 
			
		||||
| 
						 | 
				
			
			@ -79,9 +146,26 @@ exit:
 | 
			
		|||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK-LABEL: @test-addrec-nsw-start-pos-strip-pos
 | 
			
		||||
; CHECK: -->  {(1 + (10 smax %offset))<nuw><nsw>,+,1}<nuw><nsw><%loop> U: [11,-2147483648) S: [11,-2147483648)
 | 
			
		||||
define void @test-addrec-nsw-start-pos-strip-pos(float* %input, i32 %offset, i32 %numIterations) {
 | 
			
		||||
; CHECK-LABEL: 'test-addrec-nsw-start-pos-strip-pos'
 | 
			
		||||
; CHECK-NEXT:  Classifying expressions for: @test-addrec-nsw-start-pos-strip-pos
 | 
			
		||||
; CHECK-NEXT:    %min = select i1 %cmp, i32 %offset, i32 10
 | 
			
		||||
; CHECK-NEXT:    --> (10 smax %offset) U: [10,-2147483648) S: [10,-2147483648)
 | 
			
		||||
; CHECK-NEXT:    %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %nexti = add nsw i32 %i, 1
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,-2147483648) S: [1,-2147483648) Exits: %numIterations LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %index32 = add nsw i32 %nexti, %min
 | 
			
		||||
; CHECK-NEXT:    --> {(1 + (10 smax %offset))<nuw><nsw>,+,1}<nuw><nsw><%loop> U: [11,-2147483648) S: [11,-2147483648) Exits: ((10 smax %offset) + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %ptr = getelementptr inbounds float, float* %input, i32 %index32
 | 
			
		||||
; CHECK-NEXT:    --> {(4 + (4 * (zext i32 (10 smax %offset) to i64))<nuw><nsw> + %input)<nuw>,+,4}<nuw><%loop> U: [44,0) S: [44,0) Exits: (4 + (4 * (zext i32 (-1 + %numIterations) to i64))<nuw><nsw> + (4 * (zext i32 (10 smax %offset) to i64))<nuw><nsw> + %input) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:  Determining loop execution counts for: @test-addrec-nsw-start-pos-strip-pos
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %numIterations)
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (-1 + %numIterations)
 | 
			
		||||
; CHECK-NEXT:   Predicates:
 | 
			
		||||
; CHECK:       Loop %loop: Trip multiple is 1
 | 
			
		||||
;
 | 
			
		||||
entry:
 | 
			
		||||
  %cmp = icmp sgt i32 %offset, 10
 | 
			
		||||
  %min = select i1 %cmp, i32 %offset, i32  10
 | 
			
		||||
| 
						 | 
				
			
			@ -99,9 +183,26 @@ exit:
 | 
			
		|||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK-LABEL: @test-addrec-nsw-start-neg-strip-pos
 | 
			
		||||
; CHECK: -->  {(1 + (-10 smax %offset))<nsw>,+,1}<nsw><%loop> U: [-9,-2147483648) S: [-9,-2147483648)
 | 
			
		||||
define void @test-addrec-nsw-start-neg-strip-pos(float* %input, i32 %offset, i32 %numIterations) {
 | 
			
		||||
; CHECK-LABEL: 'test-addrec-nsw-start-neg-strip-pos'
 | 
			
		||||
; CHECK-NEXT:  Classifying expressions for: @test-addrec-nsw-start-neg-strip-pos
 | 
			
		||||
; CHECK-NEXT:    %min = select i1 %cmp, i32 %offset, i32 -10
 | 
			
		||||
; CHECK-NEXT:    --> (-10 smax %offset) U: [-10,-2147483648) S: [-10,-2147483648)
 | 
			
		||||
; CHECK-NEXT:    %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
 | 
			
		||||
; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %nexti = add nsw i32 %i, 1
 | 
			
		||||
; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,-2147483648) S: [1,-2147483648) Exits: %numIterations LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %index32 = add nsw i32 %nexti, %min
 | 
			
		||||
; CHECK-NEXT:    --> {(1 + (-10 smax %offset))<nsw>,+,1}<nsw><%loop> U: [-9,-2147483648) S: [-9,-2147483648) Exits: ((-10 smax %offset) + %numIterations) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:    %ptr = getelementptr inbounds float, float* %input, i32 %index32
 | 
			
		||||
; CHECK-NEXT:    --> {(4 + (4 * (sext i32 (-10 smax %offset) to i64))<nsw> + %input),+,4}<nw><%loop> U: full-set S: full-set Exits: (4 + (4 * (zext i32 (-1 + %numIterations) to i64))<nuw><nsw> + (4 * (sext i32 (-10 smax %offset) to i64))<nsw> + %input) LoopDispositions: { %loop: Computable }
 | 
			
		||||
; CHECK-NEXT:  Determining loop execution counts for: @test-addrec-nsw-start-neg-strip-pos
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %numIterations)
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
 | 
			
		||||
; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (-1 + %numIterations)
 | 
			
		||||
; CHECK-NEXT:   Predicates:
 | 
			
		||||
; CHECK:       Loop %loop: Trip multiple is 1
 | 
			
		||||
;
 | 
			
		||||
entry:
 | 
			
		||||
  %cmp = icmp sgt i32 %offset, -10
 | 
			
		||||
  %min = select i1 %cmp, i32 %offset, i32  -10
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue