Home | History | Annotate | Download | only in IndVarSimplify
      1 ; Test that we can evaluate the exit values of various expression types.  Since
      2 ; these loops all have predictable exit values we can replace the use outside
      3 ; of the loop with a closed-form computation, making the loop dead.
      4 ;
      5 ; RUN: opt < %s -indvars -loop-deletion -simplifycfg | \
      6 ; RUN:   llvm-dis | not grep br
      7 
      8 define i32 @polynomial_constant() {
      9 ; <label>:0
     10 	br label %Loop
     11 
     12 Loop:		; preds = %Loop, %0
     13 	%A1 = phi i32 [ 0, %0 ], [ %A2, %Loop ]		; <i32> [#uses=3]
     14 	%B1 = phi i32 [ 0, %0 ], [ %B2, %Loop ]		; <i32> [#uses=1]
     15 	%A2 = add i32 %A1, 1		; <i32> [#uses=1]
     16 	%B2 = add i32 %B1, %A1		; <i32> [#uses=2]
     17 	%C = icmp eq i32 %A1, 1000		; <i1> [#uses=1]
     18 	br i1 %C, label %Out, label %Loop
     19 
     20 Out:		; preds = %Loop
     21 	ret i32 %B2
     22 }
     23 
     24 define i32 @NSquare(i32 %N) {
     25 ; <label>:0
     26 	br label %Loop
     27 
     28 Loop:		; preds = %Loop, %0
     29 	%X = phi i32 [ 0, %0 ], [ %X2, %Loop ]		; <i32> [#uses=4]
     30 	%X2 = add i32 %X, 1		; <i32> [#uses=1]
     31 	%c = icmp eq i32 %X, %N		; <i1> [#uses=1]
     32 	br i1 %c, label %Out, label %Loop
     33 
     34 Out:		; preds = %Loop
     35 	%Y = mul i32 %X, %X		; <i32> [#uses=1]
     36 	ret i32 %Y
     37 }
     38 
     39 define i32 @NSquareOver2(i32 %N) {
     40 ; <label>:0
     41 	br label %Loop
     42 
     43 Loop:		; preds = %Loop, %0
     44 	%X = phi i32 [ 0, %0 ], [ %X2, %Loop ]		; <i32> [#uses=3]
     45 	%Y = phi i32 [ 15, %0 ], [ %Y2, %Loop ]		; <i32> [#uses=1]
     46 	%Y2 = add i32 %Y, %X		; <i32> [#uses=2]
     47 	%X2 = add i32 %X, 1		; <i32> [#uses=1]
     48 	%c = icmp eq i32 %X, %N		; <i1> [#uses=1]
     49 	br i1 %c, label %Out, label %Loop
     50 
     51 Out:		; preds = %Loop
     52 	ret i32 %Y2
     53 }
     54 
     55 define i32 @strength_reduced() {
     56 ; <label>:0
     57 	br label %Loop
     58 
     59 Loop:		; preds = %Loop, %0
     60 	%A1 = phi i32 [ 0, %0 ], [ %A2, %Loop ]		; <i32> [#uses=3]
     61 	%B1 = phi i32 [ 0, %0 ], [ %B2, %Loop ]		; <i32> [#uses=1]
     62 	%A2 = add i32 %A1, 1		; <i32> [#uses=1]
     63 	%B2 = add i32 %B1, %A1		; <i32> [#uses=2]
     64 	%C = icmp eq i32 %A1, 1000		; <i1> [#uses=1]
     65 	br i1 %C, label %Out, label %Loop
     66 
     67 Out:		; preds = %Loop
     68 	ret i32 %B2
     69 }
     70 
     71 define i32 @chrec_equals() {
     72 entry:
     73 	br label %no_exit
     74 
     75 no_exit:		; preds = %no_exit, %entry
     76 	%i0 = phi i32 [ 0, %entry ], [ %i1, %no_exit ]		; <i32> [#uses=3]
     77 	%ISq = mul i32 %i0, %i0		; <i32> [#uses=1]
     78 	%i1 = add i32 %i0, 1		; <i32> [#uses=2]
     79 	%tmp.1 = icmp ne i32 %ISq, 10000		; <i1> [#uses=1]
     80 	br i1 %tmp.1, label %no_exit, label %loopexit
     81 
     82 loopexit:		; preds = %no_exit
     83 	ret i32 %i1
     84 }
     85 
     86 define i16 @cast_chrec_test() {
     87 ; <label>:0
     88 	br label %Loop
     89 
     90 Loop:		; preds = %Loop, %0
     91 	%A1 = phi i32 [ 0, %0 ], [ %A2, %Loop ]		; <i32> [#uses=2]
     92 	%B1 = trunc i32 %A1 to i16		; <i16> [#uses=2]
     93 	%A2 = add i32 %A1, 1		; <i32> [#uses=1]
     94 	%C = icmp eq i16 %B1, 1000		; <i1> [#uses=1]
     95 	br i1 %C, label %Out, label %Loop
     96 
     97 Out:		; preds = %Loop
     98 	ret i16 %B1
     99 }
    100 
    101 define i32 @linear_div_fold() {
    102 entry:
    103 	br label %loop
    104 
    105 loop:		; preds = %loop, %entry
    106 	%i = phi i32 [ 4, %entry ], [ %i.next, %loop ]		; <i32> [#uses=3]
    107 	%i.next = add i32 %i, 8		; <i32> [#uses=1]
    108 	%RV = udiv i32 %i, 2		; <i32> [#uses=1]
    109 	%c = icmp ne i32 %i, 68		; <i1> [#uses=1]
    110 	br i1 %c, label %loop, label %loopexit
    111 
    112 loopexit:		; preds = %loop
    113 	ret i32 %RV
    114 }
    115