1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3 4; PR12189 5define i1 @test1(i32 %x) { 6; CHECK-LABEL: @test1( 7; CHECK-NEXT: br i1 true, label [[A:%.*]], label [[B:%.*]] 8; CHECK: a: 9; CHECK-NEXT: [[AA:%.*]] = or i32 [[X:%.*]], 10 10; CHECK-NEXT: br label [[C:%.*]] 11; CHECK: b: 12; CHECK-NEXT: [[BB:%.*]] = or i32 [[X]], 10 13; CHECK-NEXT: br label [[C]] 14; CHECK: c: 15; CHECK-NEXT: [[CC:%.*]] = phi i32 [ [[BB]], [[B]] ], [ [[AA]], [[A]] ] 16; CHECK-NEXT: [[D:%.*]] = urem i32 [[CC]], 2 17; CHECK-NEXT: [[E:%.*]] = icmp eq i32 [[D]], 0 18; CHECK-NEXT: ret i1 [[E]] 19; 20 br i1 true, label %a, label %b 21 22a: 23 %aa = or i32 %x, 10 24 br label %c 25 26b: 27 %bb = or i32 %x, 10 28 br label %c 29 30c: 31 %cc = phi i32 [ %bb, %b ], [%aa, %a ] 32 %d = urem i32 %cc, 2 33 %e = icmp eq i32 %d, 0 34 ret i1 %e 35} 36 37; D63489 - https://reviews.llvm.org/D63489 38; If this single-value phi form needs to be preserved to enable 39; further analysis, then -passes=instsimplify should not be running? 40 41define i32 @lcssa-phi(i32 %x) { 42; CHECK-LABEL: @lcssa-phi( 43; CHECK-NEXT: entry: 44; CHECK-NEXT: br label [[END:%.*]] 45; CHECK: end: 46; CHECK-NEXT: ret i32 [[X:%.*]] 47; 48entry: 49 br label %end 50 51end: 52 %counter.lcssa = phi i32 [ %x, %entry ] 53 ret i32 %counter.lcssa 54} 55 56define i32 @poison(i1 %cond, i32 %v) { 57; CHECK-LABEL: @poison( 58; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 59; CHECK: A: 60; CHECK-NEXT: br label [[EXIT:%.*]] 61; CHECK: B: 62; CHECK-NEXT: br label [[EXIT]] 63; CHECK: EXIT: 64; CHECK-NEXT: ret i32 [[V:%.*]] 65; 66 br i1 %cond, label %A, label %B 67A: 68 br label %EXIT 69B: 70 br label %EXIT 71EXIT: 72 %w = phi i32 [%v, %A], [poison, %B] 73 ret i32 %w 74} 75 76define i32 @undef(i1 %cond, i32 %v) { 77; CHECK-LABEL: @undef( 78; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 79; CHECK: A: 80; CHECK-NEXT: br label [[EXIT:%.*]] 81; CHECK: B: 82; CHECK-NEXT: br label [[EXIT]] 83; CHECK: EXIT: 84; CHECK-NEXT: ret i32 [[V:%.*]] 85; 86 br i1 %cond, label %A, label %B 87A: 88 br label %EXIT 89B: 90 br label %EXIT 91EXIT: 92 %w = phi i32 [%v, %A], [undef, %B] 93 ret i32 %w 94} 95 96define i8 @undef_poison(i1 %cond) { 97; CHECK-LABEL: @undef_poison( 98; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 99; CHECK: A: 100; CHECK-NEXT: br label [[EXIT:%.*]] 101; CHECK: B: 102; CHECK-NEXT: br label [[EXIT]] 103; CHECK: EXIT: 104; CHECK-NEXT: ret i8 undef 105; 106 br i1 %cond, label %A, label %B 107A: 108 br label %EXIT 109B: 110 br label %EXIT 111EXIT: 112 %r = phi i8 [undef, %A], [poison, %B] 113 ret i8 %r 114} 115 116define i8 @only_undef(i1 %cond) { 117; CHECK-LABEL: @only_undef( 118; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 119; CHECK: A: 120; CHECK-NEXT: br label [[EXIT:%.*]] 121; CHECK: B: 122; CHECK-NEXT: br label [[EXIT]] 123; CHECK: EXIT: 124; CHECK-NEXT: ret i8 undef 125; 126 br i1 %cond, label %A, label %B 127A: 128 br label %EXIT 129B: 130 br label %EXIT 131EXIT: 132 %r = phi i8 [undef, %A], [undef, %B] 133 ret i8 %r 134} 135 136define i8 @only_poison(i1 %cond) { 137; CHECK-LABEL: @only_poison( 138; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 139; CHECK: A: 140; CHECK-NEXT: br label [[EXIT:%.*]] 141; CHECK: B: 142; CHECK-NEXT: br label [[EXIT]] 143; CHECK: EXIT: 144; CHECK-NEXT: ret i8 undef 145; 146 br i1 %cond, label %A, label %B 147A: 148 br label %EXIT 149B: 150 br label %EXIT 151EXIT: 152 %r = phi i8 [poison, %A], [poison, %B] 153 ret i8 %r 154} 155 156@g = extern_weak global i32 157 158define i64 @pr49839_with_poison(i1 %c) { 159; CHECK-LABEL: @pr49839_with_poison( 160; CHECK-NEXT: entry: 161; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]] 162; CHECK: if: 163; CHECK-NEXT: br label [[JOIN]] 164; CHECK: join: 165; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ poison, [[IF]] ], [ srem (i64 1, i64 ptrtoint (ptr @g to i64)), [[ENTRY:%.*]] ] 166; CHECK-NEXT: ret i64 [[PHI]] 167; 168entry: 169 br i1 %c, label %if, label %join 170 171if: 172 br label %join 173 174join: 175 %phi = phi i64 [ poison, %if ], [ srem (i64 1, i64 ptrtoint (ptr @g to i64)) , %entry ] 176 ret i64 %phi 177} 178 179define i64 @pr49839_without_poison(i1 %c) { 180; CHECK-LABEL: @pr49839_without_poison( 181; CHECK-NEXT: entry: 182; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]] 183; CHECK: if: 184; CHECK-NEXT: br label [[JOIN]] 185; CHECK: join: 186; CHECK-NEXT: ret i64 srem (i64 1, i64 ptrtoint (ptr @g to i64)) 187; 188entry: 189 br i1 %c, label %if, label %join 190 191if: 192 br label %join 193 194join: 195 %phi = phi i64 [ srem (i64 1, i64 ptrtoint (ptr @g to i64)), %if ], [ srem (i64 1, i64 ptrtoint (ptr @g to i64)) , %entry ] 196 ret i64 %phi 197} 198 199define <1 x i64> @pr49839_vector(i1 %c) { 200; CHECK-LABEL: @pr49839_vector( 201; CHECK-NEXT: entry: 202; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]] 203; CHECK: if: 204; CHECK-NEXT: br label [[JOIN]] 205; CHECK: join: 206; CHECK-NEXT: [[PHI:%.*]] = phi <1 x i64> [ poison, [[IF]] ], [ <i64 srem (i64 1, i64 ptrtoint (ptr @g to i64))>, [[ENTRY:%.*]] ] 207; CHECK-NEXT: ret <1 x i64> [[PHI]] 208; 209entry: 210 br i1 %c, label %if, label %join 211 212if: 213 br label %join 214 215join: 216 %phi = phi <1 x i64> [ poison, %if ], [ <i64 srem (i64 1, i64 ptrtoint (ptr @g to i64))>, %entry ] 217 ret <1 x i64> %phi 218} 219