1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %X, i8 %A) { 5*9880d681SAndroid Build Coastguard Worker %shift.upgrd.1 = zext i8 %A to i32 ; <i32> [#uses=1] 6*9880d681SAndroid Build Coastguard Worker ; can be logical shift. 7*9880d681SAndroid Build Coastguard Worker %Y = ashr i32 %X, %shift.upgrd.1 ; <i32> [#uses=1] 8*9880d681SAndroid Build Coastguard Worker %Z = and i32 %Y, 1 ; <i32> [#uses=1] 9*9880d681SAndroid Build Coastguard Worker ret i32 %Z 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 11*9880d681SAndroid Build Coastguard Worker; CHECK: lshr i32 %X, %shift.upgrd.1 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i8 %tmp) { 15*9880d681SAndroid Build Coastguard Worker %tmp3 = zext i8 %tmp to i32 ; <i32> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker %tmp4 = add i32 %tmp3, 7 ; <i32> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker %tmp5 = ashr i32 %tmp4, 3 ; <i32> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker ret i32 %tmp5 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 20*9880d681SAndroid Build Coastguard Worker; CHECK: lshr i32 %tmp4, 3 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i1 %X, i64 %Y, i1 %Cond) { 24*9880d681SAndroid Build Coastguard Worker br i1 %Cond, label %T, label %F 25*9880d681SAndroid Build Coastguard WorkerT: 26*9880d681SAndroid Build Coastguard Worker %X2 = sext i1 %X to i64 27*9880d681SAndroid Build Coastguard Worker br label %C 28*9880d681SAndroid Build Coastguard WorkerF: 29*9880d681SAndroid Build Coastguard Worker %Y2 = ashr i64 %Y, 63 30*9880d681SAndroid Build Coastguard Worker br label %C 31*9880d681SAndroid Build Coastguard WorkerC: 32*9880d681SAndroid Build Coastguard Worker %P = phi i64 [%X2, %T], [%Y2, %F] 33*9880d681SAndroid Build Coastguard Worker %S = ashr i64 %P, 12 34*9880d681SAndroid Build Coastguard Worker ret i64 %S 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 37*9880d681SAndroid Build Coastguard Worker; CHECK: %P = phi i64 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %P 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i64 @test4(i1 %X, i64 %Y, i1 %Cond) { 42*9880d681SAndroid Build Coastguard Worker br i1 %Cond, label %T, label %F 43*9880d681SAndroid Build Coastguard WorkerT: 44*9880d681SAndroid Build Coastguard Worker %X2 = sext i1 %X to i64 45*9880d681SAndroid Build Coastguard Worker br label %C 46*9880d681SAndroid Build Coastguard WorkerF: 47*9880d681SAndroid Build Coastguard Worker %Y2 = ashr i64 %Y, 63 48*9880d681SAndroid Build Coastguard Worker br label %C 49*9880d681SAndroid Build Coastguard WorkerC: 50*9880d681SAndroid Build Coastguard Worker %P = phi i64 [%X2, %T], [%Y2, %F] 51*9880d681SAndroid Build Coastguard Worker %R = shl i64 %P, 12 52*9880d681SAndroid Build Coastguard Worker %S = ashr i64 %R, 12 53*9880d681SAndroid Build Coastguard Worker ret i64 %S 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 56*9880d681SAndroid Build Coastguard Worker; CHECK: %P = phi i64 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %P 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; rdar://7732987 61*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %Y) { 62*9880d681SAndroid Build Coastguard Worker br i1 undef, label %A, label %C 63*9880d681SAndroid Build Coastguard WorkerA: 64*9880d681SAndroid Build Coastguard Worker br i1 undef, label %B, label %D 65*9880d681SAndroid Build Coastguard WorkerB: 66*9880d681SAndroid Build Coastguard Worker br label %D 67*9880d681SAndroid Build Coastguard WorkerC: 68*9880d681SAndroid Build Coastguard Worker br i1 undef, label %D, label %E 69*9880d681SAndroid Build Coastguard WorkerD: 70*9880d681SAndroid Build Coastguard Worker %P = phi i32 [0, %A], [0, %B], [%Y, %C] 71*9880d681SAndroid Build Coastguard Worker %S = ashr i32 %P, 16 72*9880d681SAndroid Build Coastguard Worker ret i32 %S 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 74*9880d681SAndroid Build Coastguard Worker; CHECK: %P = phi i32 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ashr i32 %P, 16 76*9880d681SAndroid Build Coastguard WorkerE: 77*9880d681SAndroid Build Coastguard Worker ret i32 0 78*9880d681SAndroid Build Coastguard Worker} 79