xref: /aosp_15_r20/external/llvm/test/CodeGen/Hexagon/tail-dup-subreg-map.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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