1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p 2; RUN: opt < %s -indvars -S | FileCheck %s 3; RUN: opt < %s -passes=indvars -S | FileCheck %s 4target 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-n8:16:32:64" 5 6declare i1 @foo(i8*, i8*) 7declare i1 @bar() 8declare i1 @baz() 9 10define i1 @kill_backedge_and_phis(i8* align 1 %lhs, i8* align 1 %rhs, i32 %len) { 11; CHECK-LABEL: @kill_backedge_and_phis( 12; CHECK-NEXT: entry: 13; CHECK-NEXT: %length_not_zero = icmp ne i32 %len, 0 14; CHECK-NEXT: br i1 %length_not_zero, label %loop_preheader, label %exit 15; CHECK: loop_preheader: 16; CHECK-NEXT: br label %loop 17; CHECK: loop: 18; CHECK-NEXT: %iv = phi i32 [ 0, %loop_preheader ], [ %iv.next, %exiting_3 ] 19; CHECK-NEXT: %iv.wide = phi i64 [ 0, %loop_preheader ], [ %iv.wide.next, %exiting_3 ] 20; CHECK-NEXT: %iv.next = add nuw nsw i32 %iv, 1 21; CHECK-NEXT: %iv.wide.next = add nuw nsw i64 %iv.wide, 1 22; CHECK-NEXT: %left_ptr = getelementptr inbounds i8, i8* %lhs, i32 %iv 23; CHECK-NEXT: %right_ptr = getelementptr inbounds i8, i8* %rhs, i32 %iv 24; CHECK-NEXT: %result = call i1 @foo(i8* %left_ptr, i8* %right_ptr) 25; CHECK-NEXT: br i1 %result, label %exiting_1, label %exit.loopexit 26; CHECK: exiting_1: 27; CHECK-NEXT: %iv.wide.is_not_zero = icmp ne i64 %iv.wide, 0 28; CHECK-NEXT: br i1 false, label %exiting_2, label %exit.loopexit 29; CHECK: exiting_2: 30; CHECK-NEXT: %bar_ret = call i1 @bar() 31; CHECK-NEXT: br i1 %bar_ret, label %exit.loopexit, label %exiting_3 32; CHECK: exiting_3: 33; CHECK-NEXT: %baz_ret = call i1 @baz() 34; CHECK-NEXT: %continue = icmp ne i32 %iv.next, %len 35; CHECK-NEXT: %or.cond = select i1 %baz_ret, i1 %continue, i1 false 36; CHECK-NEXT: br i1 %or.cond, label %loop, label %exit.loopexit 37; CHECK: exit.loopexit: 38; CHECK-NEXT: %val.ph = phi i1 [ %baz_ret, %exiting_3 ], [ %bar_ret, %exiting_2 ], [ %iv.wide.is_not_zero, %exiting_1 ], [ %result, %loop ] 39; CHECK-NEXT: br label %exit 40; CHECK: exit: 41; CHECK-NEXT: %val = phi i1 [ false, %entry ], [ %val.ph, %exit.loopexit ] 42; CHECK-NEXT: ret i1 %val 43; 44entry: 45 %length_not_zero = icmp ne i32 %len, 0 46 br i1 %length_not_zero, label %loop_preheader, label %exit 47 48loop_preheader: 49 br label %loop 50 51loop: 52 %iv = phi i32 [ 0, %loop_preheader ], [ %iv.next, %latch ] 53 %iv.wide = phi i64 [ 0, %loop_preheader ], [ %iv.wide.next, %latch ] 54 %iv.next = add i32 %iv, 1 55 %iv.wide.next = add i64 %iv.wide, 1 56 %left_ptr = getelementptr inbounds i8, i8* %lhs, i32 %iv 57 %right_ptr = getelementptr inbounds i8, i8* %rhs, i32 %iv 58 %result = call i1 @foo(i8* %left_ptr, i8* %right_ptr) 59 br i1 %result, label %exiting_1, label %exit 60 61exiting_1: 62 %iv.wide.is_not_zero = icmp ne i64 %iv.wide, 0 63 br i1 %iv.wide.is_not_zero, label %exiting_2, label %exit 64 65exiting_2: 66 %bar_ret = call i1 @bar() 67 br i1 %bar_ret, label %exit, label %exiting_3 68 69exiting_3: 70 %baz_ret = call i1 @baz() 71 br i1 %baz_ret, label %latch, label %exit 72 73latch: 74 %continue = icmp ne i32 %iv.next, %len 75 br i1 %continue, label %loop, label %exit 76 77exit: 78 %val = phi i1 [ %result, %loop ], [ %iv.wide.is_not_zero, %exiting_1 ], 79 [ %bar_ret, %exiting_2 ], [ %baz_ret, %exiting_3 ], 80 [ %baz_ret, %latch ], [ 0, %entry ] 81 ret i1 %val 82} 83