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: [[W:%.*]] = phi i32 [ [[V:%.*]], [[A]] ], [ undef, [[B]] ] 85; CHECK-NEXT: ret i32 [[W]] 86; 87 br i1 %cond, label %A, label %B 88A: 89 br label %EXIT 90B: 91 br label %EXIT 92EXIT: 93 %w = phi i32 [%v, %A], [undef, %B] 94 ret i32 %w 95} 96 97define i8 @undef_poison(i1 %cond) { 98; CHECK-LABEL: @undef_poison( 99; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 100; CHECK: A: 101; CHECK-NEXT: br label [[EXIT:%.*]] 102; CHECK: B: 103; CHECK-NEXT: br label [[EXIT]] 104; CHECK: EXIT: 105; CHECK-NEXT: ret i8 undef 106; 107 br i1 %cond, label %A, label %B 108A: 109 br label %EXIT 110B: 111 br label %EXIT 112EXIT: 113 %r = phi i8 [undef, %A], [poison, %B] 114 ret i8 %r 115} 116 117define i8 @only_undef(i1 %cond) { 118; CHECK-LABEL: @only_undef( 119; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 120; CHECK: A: 121; CHECK-NEXT: br label [[EXIT:%.*]] 122; CHECK: B: 123; CHECK-NEXT: br label [[EXIT]] 124; CHECK: EXIT: 125; CHECK-NEXT: ret i8 undef 126; 127 br i1 %cond, label %A, label %B 128A: 129 br label %EXIT 130B: 131 br label %EXIT 132EXIT: 133 %r = phi i8 [undef, %A], [undef, %B] 134 ret i8 %r 135} 136 137define i8 @only_poison(i1 %cond) { 138; CHECK-LABEL: @only_poison( 139; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]] 140; CHECK: A: 141; CHECK-NEXT: br label [[EXIT:%.*]] 142; CHECK: B: 143; CHECK-NEXT: br label [[EXIT]] 144; CHECK: EXIT: 145; CHECK-NEXT: ret i8 poison 146; 147 br i1 %cond, label %A, label %B 148A: 149 br label %EXIT 150B: 151 br label %EXIT 152EXIT: 153 %r = phi i8 [poison, %A], [poison, %B] 154 ret i8 %r 155} 156 157; Should not fold srem to -1 due to incorrect context instruction when 158; threading over phi. 159define i32 @pr61312() { 160; CHECK-LABEL: @pr61312( 161; CHECK-NEXT: entry: 162; CHECK-NEXT: br label [[FOR_COND:%.*]] 163; CHECK: for.cond: 164; CHECK-NEXT: [[A_0:%.*]] = phi i32 [ 2, [[ENTRY:%.*]] ], [ [[DEC:%.*]], [[FOR_INC:%.*]] ] 165; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A_0]], 0 166; CHECK-NEXT: br i1 [[CMP]], label [[FOR_INC]], label [[FOR_END:%.*]] 167; CHECK: for.inc: 168; CHECK-NEXT: [[DEC]] = add nsw i32 [[A_0]], -1 169; CHECK-NEXT: br label [[FOR_COND]] 170; CHECK: for.end: 171; CHECK-NEXT: [[REM:%.*]] = srem i32 -1, [[A_0]] 172; CHECK-NEXT: ret i32 [[REM]] 173; 174entry: 175 br label %for.cond 176 177for.cond: 178 %a.0 = phi i32 [ 2, %entry ], [ %dec, %for.inc ] 179 %cmp = icmp sge i32 %a.0, 0 180 br i1 %cmp, label %for.inc, label %for.end 181 182for.inc: 183 %dec = add nsw i32 %a.0, -1 184 br label %for.cond 185 186for.end: 187 %rem = srem i32 -1, %a.0 188 ret i32 %rem 189} 190