1ea249489SAnton Afanasyev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*8f527e08SBjorn Pettersson; RUN: opt < %s -passes=aggressive-instcombine -S | FileCheck %s 3ea249489SAnton Afanasyev 4ea249489SAnton Afanasyevdefine i16 @trunc_phi(i8 %x) { 5ea249489SAnton Afanasyev; CHECK-LABEL: @trunc_phi( 6ea249489SAnton Afanasyev; CHECK-NEXT: LoopHeader: 70dd84013SAnton Afanasyev; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[X:%.*]] to i16 8ea249489SAnton Afanasyev; CHECK-NEXT: br label [[LOOP:%.*]] 9ea249489SAnton Afanasyev; CHECK: Loop: 100dd84013SAnton Afanasyev; CHECK-NEXT: [[ZEXT2:%.*]] = phi i16 [ [[ZEXT]], [[LOOPHEADER:%.*]] ], [ [[SHL:%.*]], [[LOOP]] ] 11ea249489SAnton Afanasyev; CHECK-NEXT: [[J:%.*]] = phi i32 [ 0, [[LOOPHEADER]] ], [ [[I:%.*]], [[LOOP]] ] 120dd84013SAnton Afanasyev; CHECK-NEXT: [[SHL]] = shl i16 [[ZEXT2]], 1 13ea249489SAnton Afanasyev; CHECK-NEXT: [[I]] = add i32 [[J]], 1 14ea249489SAnton Afanasyev; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[I]], 10 15ea249489SAnton Afanasyev; CHECK-NEXT: br i1 [[CMP]], label [[LOOPEND:%.*]], label [[LOOP]] 16ea249489SAnton Afanasyev; CHECK: LoopEnd: 170dd84013SAnton Afanasyev; CHECK-NEXT: ret i16 [[SHL]] 18ea249489SAnton Afanasyev; 19ea249489SAnton AfanasyevLoopHeader: 20ea249489SAnton Afanasyev %zext = zext i8 %x to i32 21ea249489SAnton Afanasyev br label %Loop 22ea249489SAnton Afanasyev 23ea249489SAnton AfanasyevLoop: 24ea249489SAnton Afanasyev %zext2 = phi i32 [%zext, %LoopHeader], [%shl, %Loop] 25ea249489SAnton Afanasyev %j = phi i32 [0, %LoopHeader], [%i, %Loop] 26ea249489SAnton Afanasyev %shl = shl i32 %zext2, 1 27ea249489SAnton Afanasyev %trunc = trunc i32 %shl to i16 28ea249489SAnton Afanasyev %i = add i32 %j, 1 29ea249489SAnton Afanasyev %cmp = icmp eq i32 %i, 10 30ea249489SAnton Afanasyev br i1 %cmp, label %LoopEnd, label %Loop 31ea249489SAnton Afanasyev 32ea249489SAnton AfanasyevLoopEnd: 33ea249489SAnton Afanasyev ret i16 %trunc 34ea249489SAnton Afanasyev} 35ea249489SAnton Afanasyev 36ea249489SAnton Afanasyevdefine i16 @trunc_phi2(i8 %x, i32 %sw) { 37ea249489SAnton Afanasyev; CHECK-LABEL: @trunc_phi2( 38ea249489SAnton Afanasyev; CHECK-NEXT: LoopHeader: 390dd84013SAnton Afanasyev; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[X:%.*]] to i16 40ea249489SAnton Afanasyev; CHECK-NEXT: switch i32 [[SW:%.*]], label [[LOOPEND:%.*]] [ 41ea249489SAnton Afanasyev; CHECK-NEXT: i32 0, label [[LOOP:%.*]] 42ea249489SAnton Afanasyev; CHECK-NEXT: i32 1, label [[LOOP]] 43ea249489SAnton Afanasyev; CHECK-NEXT: ] 44ea249489SAnton Afanasyev; CHECK: Loop: 450dd84013SAnton Afanasyev; CHECK-NEXT: [[ZEXT2:%.*]] = phi i16 [ [[ZEXT]], [[LOOPHEADER:%.*]] ], [ [[ZEXT]], [[LOOPHEADER]] ], [ [[SHL:%.*]], [[LOOP]] ] 46ea249489SAnton Afanasyev; CHECK-NEXT: [[J:%.*]] = phi i32 [ 0, [[LOOPHEADER]] ], [ 0, [[LOOPHEADER]] ], [ [[I:%.*]], [[LOOP]] ] 470dd84013SAnton Afanasyev; CHECK-NEXT: [[SHL]] = shl i16 [[ZEXT2]], 1 48ea249489SAnton Afanasyev; CHECK-NEXT: [[I]] = add i32 [[J]], 1 49ea249489SAnton Afanasyev; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[I]], 10 50ea249489SAnton Afanasyev; CHECK-NEXT: br i1 [[CMP]], label [[LOOPEND]], label [[LOOP]] 51ea249489SAnton Afanasyev; CHECK: LoopEnd: 520dd84013SAnton Afanasyev; CHECK-NEXT: [[ZEXT3:%.*]] = phi i16 [ [[ZEXT]], [[LOOPHEADER]] ], [ [[ZEXT2]], [[LOOP]] ] 530dd84013SAnton Afanasyev; CHECK-NEXT: ret i16 [[ZEXT3]] 54ea249489SAnton Afanasyev; 55ea249489SAnton AfanasyevLoopHeader: 56ea249489SAnton Afanasyev %zext = zext i8 %x to i32 57ea249489SAnton Afanasyev switch i32 %sw, label %LoopEnd [ i32 0, label %Loop 58ea249489SAnton Afanasyev i32 1, label %Loop ] 59ea249489SAnton Afanasyev 60ea249489SAnton AfanasyevLoop: 61ea249489SAnton Afanasyev %zext2 = phi i32 [%zext, %LoopHeader], [%zext, %LoopHeader], [%shl, %Loop] 62ea249489SAnton Afanasyev %j = phi i32 [0, %LoopHeader], [0, %LoopHeader], [%i, %Loop] 63ea249489SAnton Afanasyev %shl = shl i32 %zext2, 1 64ea249489SAnton Afanasyev %i = add i32 %j, 1 65ea249489SAnton Afanasyev %cmp = icmp eq i32 %i, 10 66ea249489SAnton Afanasyev br i1 %cmp, label %LoopEnd, label %Loop 67ea249489SAnton Afanasyev 68ea249489SAnton AfanasyevLoopEnd: 69ea249489SAnton Afanasyev %zext3 = phi i32 [%zext, %LoopHeader], [%zext2, %Loop] 70ea249489SAnton Afanasyev %trunc = trunc i32 %zext3 to i16 71ea249489SAnton Afanasyev ret i16 %trunc 72ea249489SAnton Afanasyev} 73