1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-linux-gnu -mcpu=cortex-a57 -verify-machineinstrs < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; This file check a bug in MachineCopyPropagation pass. The last COPY will be 4*9880d681SAndroid Build Coastguard Worker; incorrectly removed if the machine instructions are as follows: 5*9880d681SAndroid Build Coastguard Worker; %Q5_Q6<def> = COPY %Q2_Q3 6*9880d681SAndroid Build Coastguard Worker; %D5<def> = 7*9880d681SAndroid Build Coastguard Worker; %D3<def> = 8*9880d681SAndroid Build Coastguard Worker; %D3<def> = COPY %D6 9*9880d681SAndroid Build Coastguard Worker; This is caused by a bug in function SourceNoLongerAvailable(), which fails to 10*9880d681SAndroid Build Coastguard Worker; remove the relationship of D6 and "%Q5_Q6<def> = COPY %Q2_Q3". 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker@failed = internal unnamed_addr global i1 false 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo: 15*9880d681SAndroid Build Coastguard Worker; CHECK: ld2 16*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: // kill: D{{[0-9]+}}<def> D{{[0-9]+}}<kill> 17*9880d681SAndroid Build Coastguard Workerdefine void @foo(<2 x i32> %shuffle251, <8 x i8> %vtbl1.i, i8* %t2, <2 x i32> %vrsubhn_v2.i1364) { 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker %val0 = alloca [2 x i64], align 8 20*9880d681SAndroid Build Coastguard Worker %val1 = alloca <2 x i64>, align 16 21*9880d681SAndroid Build Coastguard Worker %vmull = tail call <2 x i64> @llvm.aarch64.neon.umull.v2i64(<2 x i32> <i32 -1, i32 -1>, <2 x i32> %shuffle251) 22*9880d681SAndroid Build Coastguard Worker %vgetq_lane = extractelement <2 x i64> %vmull, i32 0 23*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %vgetq_lane, 1 24*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.end, label %if.then 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 27*9880d681SAndroid Build Coastguard Worker store i1 true, i1* @failed, align 1 28*9880d681SAndroid Build Coastguard Worker br label %if.end 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 31*9880d681SAndroid Build Coastguard Worker tail call void @f2() 32*9880d681SAndroid Build Coastguard Worker %sqdmull = tail call <4 x i32> @llvm.aarch64.neon.sqdmull.v4i32(<4 x i16> <i16 1, i16 0, i16 0, i16 0>, <4 x i16> <i16 2, i16 0, i16 0, i16 0>) 33*9880d681SAndroid Build Coastguard Worker %sqadd = tail call <4 x i32> @llvm.aarch64.neon.sqadd.v4i32(<4 x i32> zeroinitializer, <4 x i32> %sqdmull) 34*9880d681SAndroid Build Coastguard Worker %shuffle = shufflevector <4 x i32> %sqadd, <4 x i32> undef, <2 x i32> zeroinitializer 35*9880d681SAndroid Build Coastguard Worker %0 = mul <2 x i32> %shuffle, <i32 -1, i32 0> 36*9880d681SAndroid Build Coastguard Worker %sub = add <2 x i32> %0, <i32 1, i32 0> 37*9880d681SAndroid Build Coastguard Worker %sext = sext <2 x i32> %sub to <2 x i64> 38*9880d681SAndroid Build Coastguard Worker %vset_lane603 = shufflevector <2 x i64> %sext, <2 x i64> undef, <1 x i32> zeroinitializer 39*9880d681SAndroid Build Coastguard Worker %t1 = bitcast [2 x i64]* %val0 to i8* 40*9880d681SAndroid Build Coastguard Worker call void @llvm.aarch64.neon.st2lane.v2i64.p0i8(<2 x i64> zeroinitializer, <2 x i64> zeroinitializer, i64 1, i8* %t1) 41*9880d681SAndroid Build Coastguard Worker call void @llvm.aarch64.neon.st2lane.v1i64.p0i8(<1 x i64> <i64 4096>, <1 x i64> <i64 -1>, i64 0, i8* %t2) 42*9880d681SAndroid Build Coastguard Worker %vld2_lane = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2lane.v1i64.p0i8(<1 x i64> <i64 11>, <1 x i64> <i64 11>, i64 0, i8* %t2) 43*9880d681SAndroid Build Coastguard Worker %vld2_lane.0.extract = extractvalue { <1 x i64>, <1 x i64> } %vld2_lane, 0 44*9880d681SAndroid Build Coastguard Worker %vld2_lane.1.extract = extractvalue { <1 x i64>, <1 x i64> } %vld2_lane, 1 45*9880d681SAndroid Build Coastguard Worker %vld2_lane1 = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2lane.v1i64.p0i8(<1 x i64> %vld2_lane.0.extract, <1 x i64> %vld2_lane.1.extract, i64 0, i8* %t1) 46*9880d681SAndroid Build Coastguard Worker %vld2_lane1.0.extract = extractvalue { <1 x i64>, <1 x i64> } %vld2_lane1, 0 47*9880d681SAndroid Build Coastguard Worker %vld2_lane1.1.extract = extractvalue { <1 x i64>, <1 x i64> } %vld2_lane1, 1 48*9880d681SAndroid Build Coastguard Worker %t3 = bitcast <2 x i64>* %val1 to i8* 49*9880d681SAndroid Build Coastguard Worker call void @llvm.aarch64.neon.st2.v1i64.p0i8(<1 x i64> %vld2_lane1.0.extract, <1 x i64> %vld2_lane1.1.extract, i8* %t3) 50*9880d681SAndroid Build Coastguard Worker %t4 = load <2 x i64>, <2 x i64>* %val1, align 16 51*9880d681SAndroid Build Coastguard Worker %vsubhn = sub <2 x i64> <i64 11, i64 0>, %t4 52*9880d681SAndroid Build Coastguard Worker %vsubhn1 = lshr <2 x i64> %vsubhn, <i64 32, i64 32> 53*9880d681SAndroid Build Coastguard Worker %vsubhn2 = trunc <2 x i64> %vsubhn1 to <2 x i32> 54*9880d681SAndroid Build Coastguard Worker %neg = xor <2 x i32> %vsubhn2, <i32 -1, i32 -1> 55*9880d681SAndroid Build Coastguard Worker %sqadd1 = call <1 x i64> @llvm.aarch64.neon.usqadd.v1i64(<1 x i64> <i64 -1>, <1 x i64> <i64 1>) 56*9880d681SAndroid Build Coastguard Worker %sqadd2 = call <1 x i64> @llvm.aarch64.neon.usqadd.v1i64(<1 x i64> %vset_lane603, <1 x i64> %sqadd1) 57*9880d681SAndroid Build Coastguard Worker %sqadd3 = call <1 x i64> @llvm.aarch64.neon.usqadd.v1i64(<1 x i64> <i64 1>, <1 x i64> %sqadd2) 58*9880d681SAndroid Build Coastguard Worker %shuffle.i = shufflevector <2 x i32> <i32 undef, i32 0>, <2 x i32> %vrsubhn_v2.i1364, <2 x i32> <i32 1, i32 3> 59*9880d681SAndroid Build Coastguard Worker %cmp.i = icmp uge <2 x i32> %shuffle.i, %neg 60*9880d681SAndroid Build Coastguard Worker %sext.i = sext <2 x i1> %cmp.i to <2 x i32> 61*9880d681SAndroid Build Coastguard Worker %vpadal = call <1 x i64> @llvm.aarch64.neon.uaddlp.v1i64.v2i32(<2 x i32> %sext.i) 62*9880d681SAndroid Build Coastguard Worker %t5 = sub <1 x i64> %vpadal, %sqadd3 63*9880d681SAndroid Build Coastguard Worker %vget_lane1 = extractelement <1 x i64> %t5, i32 0 64*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp eq i64 %vget_lane1, 15 65*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %if.end2, label %if.then2 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerif.then2: ; preds = %if.end 68*9880d681SAndroid Build Coastguard Worker store i1 true, i1* @failed, align 1 69*9880d681SAndroid Build Coastguard Worker br label %if.end2 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerif.end2: ; preds = %if.then682, %if.end 72*9880d681SAndroid Build Coastguard Worker call void @f2() 73*9880d681SAndroid Build Coastguard Worker %vext = shufflevector <8 x i8> <i8 undef, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <8 x i8> %vtbl1.i, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8> 74*9880d681SAndroid Build Coastguard Worker %t6 = bitcast <8 x i8> %vext to <2 x i32> 75*9880d681SAndroid Build Coastguard Worker call void @f0(<2 x i32> %t6) 76*9880d681SAndroid Build Coastguard Worker ret void 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdeclare void @f0(<2 x i32>) 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @f1() 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdeclare void @f2() 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.sqdmull.v4i32(<4 x i16>, <4 x i16>) 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st2lane.v2i64.p0i8(<2 x i64>, <2 x i64>, i64, i8* nocapture) 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st2lane.v1i64.p0i8(<1 x i64>, <1 x i64>, i64, i8* nocapture) 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdeclare { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2lane.v1i64.p0i8(<1 x i64>, <1 x i64>, i64, i8*) 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st2.v1i64.p0i8(<1 x i64>, <1 x i64>, i8* nocapture) 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdeclare <1 x i64> @llvm.aarch64.neon.usqadd.v1i64(<1 x i64>, <1 x i64>) 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdeclare <1 x i64> @llvm.aarch64.neon.uaddlp.v1i64.v2i32(<2 x i32>) 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.sqadd.v4i32(<4 x i32>, <4 x i32>) 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.aarch64.neon.umull.v2i64(<2 x i32>, <2 x i32>) 102