1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=hexagon < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; REQUIRES: asserts 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; When tail-duplicating a block with PHI nodes that use subregisters, the 5*9880d681SAndroid Build Coastguard Worker; subregisters were dropped by the tail duplicator, resulting in invalid 6*9880d681SAndroid Build Coastguard Worker; COPY instructions being generated. 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; CHECK: = extractu(r{{[0-9]+}}, #15, #17) 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workertarget triple = "hexagon" 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker%struct.0 = type { i64, i16 } 13*9880d681SAndroid Build Coastguard Worker%struct.1 = type { i64, i64 } 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdeclare hidden fastcc void @foo(%struct.0* noalias nocapture, i8 signext, i8 zeroext, i32, i64, i64) unnamed_addr #0 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine void @fred(%struct.0* noalias nocapture sret %agg.result, %struct.1* byval nocapture readonly align 8 %a) #1 { 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* undef, align 8 20*9880d681SAndroid Build Coastguard Worker switch i32 undef, label %if.else [ 21*9880d681SAndroid Build Coastguard Worker i32 32767, label %if.then 22*9880d681SAndroid Build Coastguard Worker i32 0, label %if.then7 23*9880d681SAndroid Build Coastguard Worker ] 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 26*9880d681SAndroid Build Coastguard Worker ret void 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerif.then7: ; preds = %entry 29*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.then.i, label %if.else16.i 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerif.then.i: ; preds = %if.then7 32*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.then5.i, label %if.else.i 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerif.then5.i: ; preds = %if.then.i 35*9880d681SAndroid Build Coastguard Worker %shl.i21 = shl i64 %0, 0 36*9880d681SAndroid Build Coastguard Worker br label %if.end.i 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerif.else.i: ; preds = %if.then.i 39*9880d681SAndroid Build Coastguard Worker %shl12.i = shl i64 %0, undef 40*9880d681SAndroid Build Coastguard Worker br label %if.end.i 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerif.end.i: ; preds = %if.else.i, %if.then5.i 43*9880d681SAndroid Build Coastguard Worker %aSig0.0 = phi i64 [ undef, %if.then5.i ], [ %shl12.i, %if.else.i ] 44*9880d681SAndroid Build Coastguard Worker %storemerge43.i = phi i64 [ %shl.i21, %if.then5.i ], [ 0, %if.else.i ] 45*9880d681SAndroid Build Coastguard Worker %sub15.i = sub nsw i32 -63, undef 46*9880d681SAndroid Build Coastguard Worker br label %if.end13 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerif.else16.i: ; preds = %if.then7 49*9880d681SAndroid Build Coastguard Worker br label %if.end13 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 52*9880d681SAndroid Build Coastguard Worker %or12 = or i64 undef, 281474976710656 53*9880d681SAndroid Build Coastguard Worker br label %if.end13 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerif.end13: ; preds = %if.else, %if.else16.i, %if.end.i 56*9880d681SAndroid Build Coastguard Worker %aSig1.1 = phi i64 [ %0, %if.else ], [ %storemerge43.i, %if.end.i ], [ undef, %if.else16.i ] 57*9880d681SAndroid Build Coastguard Worker %aSig0.2 = phi i64 [ %or12, %if.else ], [ %aSig0.0, %if.end.i ], [ undef, %if.else16.i ] 58*9880d681SAndroid Build Coastguard Worker %aExp.0 = phi i32 [ undef, %if.else ], [ %sub15.i, %if.end.i ], [ undef, %if.else16.i ] 59*9880d681SAndroid Build Coastguard Worker %shl2.i = shl i64 %aSig0.2, 15 60*9880d681SAndroid Build Coastguard Worker %shr.i = lshr i64 %aSig1.1, 49 61*9880d681SAndroid Build Coastguard Worker %or.i = or i64 %shl2.i, %shr.i 62*9880d681SAndroid Build Coastguard Worker tail call fastcc void @foo(%struct.0* noalias %agg.result, i8 signext 80, i8 zeroext undef, i32 %aExp.0, i64 %or.i, i64 undef) 63*9880d681SAndroid Build Coastguard Worker unreachable 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerattributes #0 = { norecurse nounwind } 67*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind } 68