1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=newgvn -S | FileCheck %s 3 4 5;; Block 6 is reachable, but edge 6->4 is not 6;; This means the phi value is undef, not 0 7; Function Attrs: ssp uwtable 8define i16 @hoge() { 9; CHECK-LABEL: @hoge( 10; CHECK-NEXT: bb: 11; CHECK-NEXT: switch i8 undef, label [[BB7:%.*]] [ 12; CHECK-NEXT: i8 0, label [[BB1:%.*]] 13; CHECK-NEXT: i8 12, label [[BB2:%.*]] 14; CHECK-NEXT: ] 15; CHECK: bb1: 16; CHECK-NEXT: br label [[BB6:%.*]] 17; CHECK: bb2: 18; CHECK-NEXT: br label [[BB4:%.*]] 19; CHECK: bb3: 20; CHECK-NEXT: unreachable 21; CHECK: bb4: 22; CHECK-NEXT: ret i16 undef 23; CHECK: bb6: 24; CHECK-NEXT: br i1 true, label [[BB3:%.*]], label [[BB4]] 25; CHECK: bb7: 26; CHECK-NEXT: unreachable 27; 28bb: 29 switch i8 undef, label %bb7 [ 30 i8 0, label %bb1 31 i8 12, label %bb2 32 ] 33 34bb1: ; preds = %bb 35 br label %bb6 36 37bb2: ; preds = %bb 38 br label %bb4 39 40bb3: ; preds = %bb6 41 unreachable 42 43bb4: ; preds = %bb6, %bb2 44 %tmp = phi i16 [ 0, %bb6 ], [ undef, %bb2 ] 45 ret i16 %tmp 46 47bb6: ; preds = %bb4 48 br i1 true, label %bb3, label %bb4 49 50bb7: ; preds = %bb 51 unreachable 52} 53 54define i8 @only_undef(i1 %cond) { 55; CHECK-LABEL: @only_undef( 56; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 57; CHECK: A: 58; CHECK-NEXT: br label [[EXIT:%.*]] 59; CHECK: B: 60; CHECK-NEXT: br label [[EXIT]] 61; CHECK: EXIT: 62; CHECK-NEXT: ret i8 undef 63; 64 br i1 %cond, label %A, label %B 65A: 66 br label %EXIT 67B: 68 br label %EXIT 69EXIT: 70 %r = phi i8 [undef, %A], [undef, %B] 71 ret i8 %r 72} 73 74define i8 @only_poison(i1 %cond) { 75; CHECK-LABEL: @only_poison( 76; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 77; CHECK: A: 78; CHECK-NEXT: br label [[EXIT:%.*]] 79; CHECK: B: 80; CHECK-NEXT: br label [[EXIT]] 81; CHECK: EXIT: 82; CHECK-NEXT: ret i8 poison 83; 84 br i1 %cond, label %A, label %B 85A: 86 br label %EXIT 87B: 88 br label %EXIT 89EXIT: 90 %r = phi i8 [poison, %A], [poison, %B] 91 ret i8 %r 92} 93 94define i8 @undef_poison(i1 %cond) { 95; CHECK-LABEL: @undef_poison( 96; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 97; CHECK: A: 98; CHECK-NEXT: br label [[EXIT:%.*]] 99; CHECK: B: 100; CHECK-NEXT: br label [[EXIT]] 101; CHECK: EXIT: 102; CHECK-NEXT: ret i8 undef 103; 104 br i1 %cond, label %A, label %B 105A: 106 br label %EXIT 107B: 108 br label %EXIT 109EXIT: 110 %r = phi i8 [undef, %A], [poison, %B] 111 ret i8 %r 112} 113 114define i8 @value_undef(i1 %cond, i8 %v) { 115; CHECK-LABEL: @value_undef( 116; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 117; CHECK: A: 118; CHECK-NEXT: br label [[EXIT:%.*]] 119; CHECK: B: 120; CHECK-NEXT: br label [[EXIT]] 121; CHECK: EXIT: 122; CHECK-NEXT: [[R:%.*]] = phi i8 [ undef, [[A]] ], [ [[V:%.*]], [[B]] ] 123; CHECK-NEXT: ret i8 [[R]] 124; 125 br i1 %cond, label %A, label %B 126A: 127 br label %EXIT 128B: 129 br label %EXIT 130EXIT: 131 %r = phi i8 [undef, %A], [%v, %B] 132 ret i8 %r 133} 134 135define i8 @value_undef_noundef(i1 %cond, i8 noundef %v) { 136; CHECK-LABEL: @value_undef_noundef( 137; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 138; CHECK: A: 139; CHECK-NEXT: br label [[EXIT:%.*]] 140; CHECK: B: 141; CHECK-NEXT: br label [[EXIT]] 142; CHECK: EXIT: 143; CHECK-NEXT: ret i8 [[V:%.*]] 144; 145 br i1 %cond, label %A, label %B 146A: 147 br label %EXIT 148B: 149 br label %EXIT 150EXIT: 151 %r = phi i8 [undef, %A], [%v, %B] 152 ret i8 %r 153} 154 155define i8 @value_poison(i1 %cond, i8 %v) { 156; CHECK-LABEL: @value_poison( 157; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 158; CHECK: A: 159; CHECK-NEXT: br label [[EXIT:%.*]] 160; CHECK: B: 161; CHECK-NEXT: br label [[EXIT]] 162; CHECK: EXIT: 163; CHECK-NEXT: ret i8 [[V:%.*]] 164; 165 br i1 %cond, label %A, label %B 166A: 167 br label %EXIT 168B: 169 br label %EXIT 170EXIT: 171 %r = phi i8 [poison, %A], [%v, %B] 172 ret i8 %r 173} 174