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