Home | History | Annotate | Download | only in IndVarSimplify
      1 ; RUN: opt -indvars -instcombine -S < %s | FileCheck %s
      2 
      3 ;; Test that loop's exit value is rewritten to its initial
      4 ;; value from loop preheader
      5 define i32 @test1(i32* %var) {
      6 ; CHECK-LABEL: @test1
      7 entry:
      8  %cond = icmp eq i32* %var, null 
      9  br label %header
     10 
     11 header:
     12  %phi_indvar = phi i32 [0, %entry], [%indvar, %loop]
     13  br i1 %cond, label %loop, label %exit
     14 
     15 loop:
     16  %indvar = add i32 %phi_indvar, 1
     17  br label %header
     18 
     19 exit:
     20 ; CHECK: ret i32 0
     21  ret i32 %phi_indvar
     22 }
     23 
     24 ;; Test that we can not rewrite loop exit value if it's not
     25 ;; a phi node (%indvar is an add instruction in this test).
     26 define i32 @test2(i32* %var) {
     27 ; CHECK-LABEL: @test2
     28 entry:
     29  %cond = icmp eq i32* %var, null 
     30  br label %header
     31 
     32 header:
     33  %phi_indvar = phi i32 [0, %entry], [%indvar, %header]
     34  %indvar = add i32 %phi_indvar, 1
     35  br i1 %cond, label %header, label %exit
     36 
     37 exit:
     38 ; CHECK: ret i32 %indvar
     39  ret i32 %indvar
     40 }
     41 
     42 ;; Test that we can not rewrite loop exit value if the condition
     43 ;; is not in loop header.
     44 define i32 @test3(i32* %var) {
     45 ; CHECK-LABEL: @test3
     46 entry:
     47  %cond1 = icmp eq i32* %var, null 
     48  br label %header
     49 
     50 header:
     51  %phi_indvar = phi i32 [0, %entry], [%indvar, %header], [%indvar, %body]
     52  %indvar = add i32 %phi_indvar, 1
     53  %cond2 = icmp eq i32 %indvar, 10
     54  br i1 %cond2, label %header, label %body
     55  
     56 body:
     57  br i1 %cond1, label %header, label %exit
     58 
     59 exit:
     60 ; CHECK: ret i32 %phi_indvar
     61  ret i32 %phi_indvar
     62 }
     63 
     64