1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define i32 @const(i1 %cond) { 5; CHECK-LABEL: @const( 6; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 7; CHECK: A: 8; CHECK-NEXT: br label [[C:%.*]] 9; CHECK: B: 10; CHECK-NEXT: br label [[C]] 11; CHECK: C: 12; CHECK-NEXT: [[Y:%.*]] = phi i32 [ 0, [[A]] ], [ 1, [[B]] ] 13; CHECK-NEXT: ret i32 [[Y]] 14; 15 br i1 %cond, label %A, label %B 16A: 17 br label %C 18B: 19 br label %C 20C: 21 %y = phi i32 [0, %A], [1, %B] 22 %y.fr = freeze i32 %y 23 ret i32 %y.fr 24} 25 26define <2 x i32> @vec(i1 %cond) { 27; CHECK-LABEL: @vec( 28; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 29; CHECK: A: 30; CHECK-NEXT: br label [[C:%.*]] 31; CHECK: B: 32; CHECK-NEXT: br label [[C]] 33; CHECK: C: 34; CHECK-NEXT: [[Y:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[A]] ], [ <i32 2, i32 3>, [[B]] ] 35; CHECK-NEXT: ret <2 x i32> [[Y]] 36; 37 br i1 %cond, label %A, label %B 38A: 39 br label %C 40B: 41 br label %C 42C: 43 %y = phi <2 x i32> [<i32 0, i32 1>, %A], [<i32 2, i32 3>, %B] 44 %y.fr = freeze <2 x i32> %y 45 ret <2 x i32> %y.fr 46} 47 48define <2 x i32> @vec_undef(i1 %cond) { 49; CHECK-LABEL: @vec_undef( 50; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 51; CHECK: A: 52; CHECK-NEXT: br label [[C:%.*]] 53; CHECK: B: 54; CHECK-NEXT: br label [[C]] 55; CHECK: C: 56; CHECK-NEXT: [[Y:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[A]] ], [ <i32 2, i32 0>, [[B]] ] 57; CHECK-NEXT: ret <2 x i32> [[Y]] 58; 59 br i1 %cond, label %A, label %B 60A: 61 br label %C 62B: 63 br label %C 64C: 65 %y = phi <2 x i32> [<i32 0, i32 1>, %A], [<i32 2, i32 undef>, %B] 66 %y.fr = freeze <2 x i32> %y 67 ret <2 x i32> %y.fr 68} 69 70define i32 @one(i1 %cond, i32 %x) { 71; CHECK-LABEL: @one( 72; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 73; CHECK: A: 74; CHECK-NEXT: br label [[C:%.*]] 75; CHECK: B: 76; CHECK-NEXT: [[TMP1:%.*]] = freeze i32 [[X:%.*]] 77; CHECK-NEXT: br label [[C]] 78; CHECK: C: 79; CHECK-NEXT: [[Y:%.*]] = phi i32 [ 0, [[A]] ], [ [[TMP1]], [[B]] ] 80; CHECK-NEXT: ret i32 [[Y]] 81; 82 br i1 %cond, label %A, label %B 83A: 84 br label %C 85B: 86 br label %C 87C: 88 %y = phi i32 [0, %A], [%x, %B] 89 %y.fr = freeze i32 %y 90 ret i32 %y.fr 91} 92 93define i32 @two(i1 %cond, i32 %x, i32 %x2) { 94; CHECK-LABEL: @two( 95; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 96; CHECK: A: 97; CHECK-NEXT: br label [[C:%.*]] 98; CHECK: B: 99; CHECK-NEXT: br label [[C]] 100; CHECK: C: 101; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[X:%.*]], [[A]] ], [ [[X2:%.*]], [[B]] ] 102; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] 103; CHECK-NEXT: ret i32 [[Y_FR]] 104; 105 br i1 %cond, label %A, label %B 106A: 107 br label %C 108B: 109 br label %C 110C: 111 %y = phi i32 [%x, %A], [%x2, %B] 112 %y.fr = freeze i32 %y 113 ret i32 %y.fr 114} 115 116define i32 @two_undef(i8 %cond, i32 %x) { 117; CHECK-LABEL: @two_undef( 118; CHECK-NEXT: switch i8 [[COND:%.*]], label [[A:%.*]] [ 119; CHECK-NEXT: i8 0, label [[B:%.*]] 120; CHECK-NEXT: i8 1, label [[C:%.*]] 121; CHECK-NEXT: ] 122; CHECK: A: 123; CHECK-NEXT: br label [[D:%.*]] 124; CHECK: B: 125; CHECK-NEXT: br label [[D]] 126; CHECK: C: 127; CHECK-NEXT: br label [[D]] 128; CHECK: D: 129; CHECK-NEXT: [[Y:%.*]] = phi i32 [ undef, [[A]] ], [ [[X:%.*]], [[B]] ], [ 0, [[C]] ] 130; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] 131; CHECK-NEXT: ret i32 [[Y_FR]] 132; 133 switch i8 %cond, label %A [ 134 i8 0, label %B 135 i8 1, label %C 136 ] 137A: 138 br label %D 139B: 140 br label %D 141C: 142 br label %D 143D: 144 %y = phi i32 [undef, %A], [%x, %B], [0, %C] 145 %y.fr = freeze i32 %y 146 ret i32 %y.fr 147} 148 149define i32 @one_undef(i8 %cond) { 150; CHECK-LABEL: @one_undef( 151; CHECK-NEXT: switch i8 [[COND:%.*]], label [[A:%.*]] [ 152; CHECK-NEXT: i8 0, label [[B:%.*]] 153; CHECK-NEXT: i8 1, label [[C:%.*]] 154; CHECK-NEXT: ] 155; CHECK: A: 156; CHECK-NEXT: br label [[D:%.*]] 157; CHECK: B: 158; CHECK-NEXT: br label [[D]] 159; CHECK: C: 160; CHECK-NEXT: br label [[D]] 161; CHECK: D: 162; CHECK-NEXT: [[Y:%.*]] = phi i32 [ 0, [[A]] ], [ 32, [[B]] ], [ 0, [[C]] ] 163; CHECK-NEXT: ret i32 [[Y]] 164; 165 switch i8 %cond, label %A [ 166 i8 0, label %B 167 i8 1, label %C 168 ] 169A: 170 br label %D 171B: 172 br label %D 173C: 174 br label %D 175D: 176 %y = phi i32 [undef, %A], [32, %B], [0, %C] 177 %y.fr = freeze i32 %y 178 ret i32 %y.fr 179} 180 181@glb = global i8 0 182 183define i32 @one_constexpr(i8 %cond, i32 %x) { 184; CHECK-LABEL: @one_constexpr( 185; CHECK-NEXT: switch i8 [[COND:%.*]], label [[A:%.*]] [ 186; CHECK-NEXT: i8 0, label [[B:%.*]] 187; CHECK-NEXT: i8 1, label [[C:%.*]] 188; CHECK-NEXT: ] 189; CHECK: A: 190; CHECK-NEXT: [[TMP1:%.*]] = freeze i32 ptrtoint (ptr getelementptr inbounds nuw (i8, ptr @glb, i64 2) to i32) 191; CHECK-NEXT: br label [[D:%.*]] 192; CHECK: B: 193; CHECK-NEXT: br label [[D]] 194; CHECK: C: 195; CHECK-NEXT: br label [[D]] 196; CHECK: D: 197; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[TMP1]], [[A]] ], [ 32, [[B]] ], [ 0, [[C]] ] 198; CHECK-NEXT: ret i32 [[Y]] 199; 200 switch i8 %cond, label %A [ 201 i8 0, label %B 202 i8 1, label %C 203 ] 204A: 205 br label %D 206B: 207 br label %D 208C: 209 br label %D 210D: 211 %y = phi i32 [ptrtoint (ptr getelementptr inbounds (i8, ptr @glb, i64 2) to i32), %A], [32, %B], [0, %C] 212 %y.fr = freeze i32 %y 213 ret i32 %y.fr 214} 215