1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-unswitch -verify-loop-info -S < %s 2>&1 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i32* %A, i1 %C) { 4*9880d681SAndroid Build Coastguard Workerentry: 5*9880d681SAndroid Build Coastguard Worker br label %no_exit 6*9880d681SAndroid Build Coastguard Workerno_exit: ; preds = %no_exit.backedge, %entry 7*9880d681SAndroid Build Coastguard Worker %i.0.0 = phi i32 [ 0, %entry ], [ %i.0.0.be, %no_exit.backedge ] ; <i32> [#uses=3] 8*9880d681SAndroid Build Coastguard Worker %gep.upgrd.1 = zext i32 %i.0.0 to i64 ; <i64> [#uses=1] 9*9880d681SAndroid Build Coastguard Worker %tmp.7 = getelementptr i32, i32* %A, i64 %gep.upgrd.1 ; <i32*> [#uses=4] 10*9880d681SAndroid Build Coastguard Worker %tmp.13 = load i32, i32* %tmp.7 ; <i32> [#uses=2] 11*9880d681SAndroid Build Coastguard Worker %tmp.14 = add i32 %tmp.13, 1 ; <i32> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker store i32 %tmp.14, i32* %tmp.7 13*9880d681SAndroid Build Coastguard Worker br i1 %C, label %then, label %endif 14*9880d681SAndroid Build Coastguard Workerthen: ; preds = %no_exit 15*9880d681SAndroid Build Coastguard Worker %tmp.29 = load i32, i32* %tmp.7 ; <i32> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker %tmp.30 = add i32 %tmp.29, 2 ; <i32> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker store i32 %tmp.30, i32* %tmp.7 18*9880d681SAndroid Build Coastguard Worker %inc9 = add i32 %i.0.0, 1 ; <i32> [#uses=2] 19*9880d681SAndroid Build Coastguard Worker %tmp.112 = icmp ult i32 %inc9, 100000 ; <i1> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker br i1 %tmp.112, label %no_exit.backedge, label %return 21*9880d681SAndroid Build Coastguard Workerno_exit.backedge: ; preds = %endif, %then 22*9880d681SAndroid Build Coastguard Worker %i.0.0.be = phi i32 [ %inc9, %then ], [ %inc, %endif ] ; <i32> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker br label %no_exit 24*9880d681SAndroid Build Coastguard Workerendif: ; preds = %no_exit 25*9880d681SAndroid Build Coastguard Worker %inc = add i32 %i.0.0, 1 ; <i32> [#uses=2] 26*9880d681SAndroid Build Coastguard Worker %tmp.1 = icmp ult i32 %inc, 100000 ; <i1> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker br i1 %tmp.1, label %no_exit.backedge, label %return 28*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %endif, %then 29*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.13 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; This simple test would normally unswitch, but should be inhibited by the presence of 33*9880d681SAndroid Build Coastguard Worker; the noduplicate call. 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 36*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32* %var) { 37*9880d681SAndroid Build Coastguard Worker %mem = alloca i32 38*9880d681SAndroid Build Coastguard Worker store i32 2, i32* %mem 39*9880d681SAndroid Build Coastguard Worker %c = load i32, i32* %mem 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker br label %loop_begin 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerloop_begin: 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker %var_val = load i32, i32* %var 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker switch i32 %c, label %default [ 48*9880d681SAndroid Build Coastguard Worker i32 1, label %inc 49*9880d681SAndroid Build Coastguard Worker i32 2, label %dec 50*9880d681SAndroid Build Coastguard Worker ] 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerinc: 53*9880d681SAndroid Build Coastguard Worker call void @incf() noreturn nounwind 54*9880d681SAndroid Build Coastguard Worker br label %loop_begin 55*9880d681SAndroid Build Coastguard Workerdec: 56*9880d681SAndroid Build Coastguard Worker; CHECK: call void @decf() 57*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @decf() 58*9880d681SAndroid Build Coastguard Worker call void @decf() noreturn nounwind noduplicate 59*9880d681SAndroid Build Coastguard Worker br label %loop_begin 60*9880d681SAndroid Build Coastguard Workerdefault: 61*9880d681SAndroid Build Coastguard Worker br label %loop_exit 62*9880d681SAndroid Build Coastguard Workerloop_exit: 63*9880d681SAndroid Build Coastguard Worker ret i32 0 64*9880d681SAndroid Build Coastguard Worker; CHECK: } 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; This simple test would normally unswitch, but should be inhibited by the presence of 68*9880d681SAndroid Build Coastguard Worker; the convergent call that is not control-dependent on the unswitch condition. 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 71*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32* %var) { 72*9880d681SAndroid Build Coastguard Worker %mem = alloca i32 73*9880d681SAndroid Build Coastguard Worker store i32 2, i32* %mem 74*9880d681SAndroid Build Coastguard Worker %c = load i32, i32* %mem 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker br label %loop_begin 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerloop_begin: 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker %var_val = load i32, i32* %var 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; CHECK: call void @conv() 83*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @conv() 84*9880d681SAndroid Build Coastguard Worker call void @conv() convergent 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker switch i32 %c, label %default [ 87*9880d681SAndroid Build Coastguard Worker i32 1, label %inc 88*9880d681SAndroid Build Coastguard Worker i32 2, label %dec 89*9880d681SAndroid Build Coastguard Worker ] 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerinc: 92*9880d681SAndroid Build Coastguard Worker call void @incf() noreturn nounwind 93*9880d681SAndroid Build Coastguard Worker br label %loop_begin 94*9880d681SAndroid Build Coastguard Workerdec: 95*9880d681SAndroid Build Coastguard Worker call void @decf() noreturn nounwind 96*9880d681SAndroid Build Coastguard Worker br label %loop_begin 97*9880d681SAndroid Build Coastguard Workerdefault: 98*9880d681SAndroid Build Coastguard Worker br label %loop_exit 99*9880d681SAndroid Build Coastguard Workerloop_exit: 100*9880d681SAndroid Build Coastguard Worker ret i32 0 101*9880d681SAndroid Build Coastguard Worker; CHECK: } 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdeclare void @incf() noreturn 106*9880d681SAndroid Build Coastguard Workerdeclare void @decf() noreturn 107*9880d681SAndroid Build Coastguard Workerdeclare void @conv() convergent 108