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: %result = call i1 @foo(i8* %lhs, i8* %rhs) 19; CHECK-NEXT: br i1 %result, label %exiting_1, label %exit.loopexit 20; CHECK: exiting_1: 21; CHECK-NEXT: br i1 false, label %exiting_2, label %exit.loopexit 22; CHECK: exiting_2: 23; CHECK-NEXT: %bar_ret = call i1 @bar() 24; CHECK-NEXT: br i1 %bar_ret, label %exit.loopexit, label %exiting_3 25; CHECK: exiting_3: 26; CHECK-NEXT: %baz_ret = call i1 @baz() 27; CHECK-NEXT: %continue = icmp ne i32 1, %len 28; CHECK-NEXT: %or.cond = select i1 %baz_ret, i1 %continue, i1 false 29; CHECK-NEXT: br i1 %or.cond, label %loop, label %exit.loopexit 30; CHECK: exit.loopexit: 31; CHECK-NEXT: %val.ph = phi i1 [ %baz_ret, %exiting_3 ], [ %bar_ret, %exiting_2 ], [ false, %exiting_1 ], [ %result, %loop ] 32; CHECK-NEXT: br label %exit 33; CHECK: exit: 34; CHECK-NEXT: %val = phi i1 [ false, %entry ], [ %val.ph, %exit.loopexit ] 35; CHECK-NEXT: ret i1 %val 36; 37entry: 38 %length_not_zero = icmp ne i32 %len, 0 39 br i1 %length_not_zero, label %loop_preheader, label %exit 40 41loop_preheader: 42 br label %loop 43 44loop: 45 %iv = phi i32 [ 0, %loop_preheader ], [ %iv.next, %latch ] 46 %iv.wide = phi i64 [ 0, %loop_preheader ], [ %iv.wide.next, %latch ] 47 %iv.next = add i32 %iv, 1 48 %iv.wide.next = add i64 %iv.wide, 1 49 %left_ptr = getelementptr inbounds i8, i8* %lhs, i32 %iv 50 %right_ptr = getelementptr inbounds i8, i8* %rhs, i32 %iv 51 %result = call i1 @foo(i8* %left_ptr, i8* %right_ptr) 52 br i1 %result, label %exiting_1, label %exit 53 54exiting_1: 55 %iv.wide.is_not_zero = icmp ne i64 %iv.wide, 0 56 br i1 %iv.wide.is_not_zero, label %exiting_2, label %exit 57 58exiting_2: 59 %bar_ret = call i1 @bar() 60 br i1 %bar_ret, label %exit, label %exiting_3 61 62exiting_3: 63 %baz_ret = call i1 @baz() 64 br i1 %baz_ret, label %latch, label %exit 65 66latch: 67 %continue = icmp ne i32 %iv.next, %len 68 br i1 %continue, label %loop, label %exit 69 70exit: 71 %val = phi i1 [ %result, %loop ], [ %iv.wide.is_not_zero, %exiting_1 ], 72 [ %bar_ret, %exiting_2 ], [ %baz_ret, %exiting_3 ], 73 [ %baz_ret, %latch ], [ 0, %entry ] 74 ret i1 %val 75} 76 77define i1 @siblings(i8* align 1 %lhs, i8* align 1 %rhs, i32 %len) { 78; CHECK-LABEL: @siblings( 79; CHECK-NEXT: entry: 80; CHECK-NEXT: %length_not_zero = icmp ne i32 %len, 0 81; CHECK-NEXT: br i1 %length_not_zero, label %weird_loop.preheader, label %exit 82; CHECK: weird_loop.preheader: 83; CHECK-NEXT: br label %weird_loop 84; CHECK: weird_loop: 85; CHECK-NEXT: %weird.iv = phi i32 [ %weird.iv.next, %weird_loop ], [ 0, %weird_loop.preheader ] 86; CHECK-NEXT: %weird.iv.next = add i32 %weird.iv, 1 87; CHECK-NEXT: %weird.cond = call i1 @bar() 88; CHECK-NEXT: br i1 %weird.cond, label %weird_loop, label %loop.preheader 89; CHECK: loop.preheader: 90; CHECK-NEXT: %weird.iv.lcssa = phi i32 [ %weird.iv, %weird_loop ] 91; CHECK-NEXT: br label %loop 92; CHECK: loop: 93; CHECK-NEXT: %iv.next = add i32 %weird.iv.lcssa, 1 94; CHECK-NEXT: %left_ptr = getelementptr inbounds i8, i8* %lhs, i32 %weird.iv.lcssa 95; CHECK-NEXT: %right_ptr = getelementptr inbounds i8, i8* %rhs, i32 %weird.iv.lcssa 96; CHECK-NEXT: %result = call i1 @foo(i8* %left_ptr, i8* %right_ptr) 97; CHECK-NEXT: br i1 %result, label %exiting_1, label %exit.loopexit 98; CHECK: exiting_1: 99; CHECK-NEXT: br i1 false, label %exiting_2, label %exit.loopexit 100; CHECK: exiting_2: 101; CHECK-NEXT: %bar_ret = call i1 @bar() 102; CHECK-NEXT: br i1 %bar_ret, label %exit.loopexit, label %exiting_3 103; CHECK: exiting_3: 104; CHECK-NEXT: %baz_ret = call i1 @baz() 105; CHECK-NEXT: %continue = icmp ne i32 %iv.next, %len 106; CHECK-NEXT: %or.cond = select i1 %baz_ret, i1 %continue, i1 false 107; CHECK-NEXT: br i1 %or.cond, label %loop, label %exit.loopexit 108; CHECK: exit.loopexit: 109; CHECK-NEXT: %val.ph = phi i1 [ %baz_ret, %exiting_3 ], [ %bar_ret, %exiting_2 ], [ false, %exiting_1 ], [ %result, %loop ] 110; CHECK-NEXT: br label %exit 111; CHECK: exit: 112; CHECK-NEXT: %val = phi i1 [ false, %entry ], [ %val.ph, %exit.loopexit ] 113; CHECK-NEXT: ret i1 %val 114; 115entry: 116 %length_not_zero = icmp ne i32 %len, 0 117 br i1 %length_not_zero, label %weird_loop, label %exit 118 119weird_loop: 120 %weird.iv = phi i32 [ 0, %entry ], [ %weird.iv.next, %weird_loop ] 121 %weird.iv.next = add i32 %weird.iv, 1 122 %weird.iv.wide = zext i32 %weird.iv to i64 123 %weird.cond = call i1 @bar() 124 br i1 %weird.cond, label %weird_loop, label %loop 125 126loop: 127 %iv = phi i32 [ %weird.iv, %weird_loop ], [ %iv.next, %latch ] 128 %iv.wide = phi i64 [ %weird.iv.wide, %weird_loop ], [ %iv.wide.next, %latch ] 129 %iv.next = add i32 %iv, 1 130 %iv.wide.next = add i64 %iv.wide, 1 131 %left_ptr = getelementptr inbounds i8, i8* %lhs, i32 %iv 132 %right_ptr = getelementptr inbounds i8, i8* %rhs, i32 %iv 133 %result = call i1 @foo(i8* %left_ptr, i8* %right_ptr) 134 br i1 %result, label %exiting_1, label %exit 135 136exiting_1: 137 %iv.wide.is_not_zero = icmp ne i64 %iv.wide, %weird.iv.wide 138 br i1 %iv.wide.is_not_zero, label %exiting_2, label %exit 139 140exiting_2: 141 %bar_ret = call i1 @bar() 142 br i1 %bar_ret, label %exit, label %exiting_3 143 144exiting_3: 145 %baz_ret = call i1 @baz() 146 br i1 %baz_ret, label %latch, label %exit 147 148latch: 149 %continue = icmp ne i32 %iv.next, %len 150 br i1 %continue, label %loop, label %exit 151 152exit: 153 %val = phi i1 [ %result, %loop ], [ %iv.wide.is_not_zero, %exiting_1 ], 154 [ %bar_ret, %exiting_2 ], [ %baz_ret, %exiting_3 ], 155 [ %baz_ret, %latch ], [ 0, %entry ] 156 ret i1 %val 157} 158