xref: /aosp_15_r20/external/llvm/test/CodeGen/Hexagon/tail-dup-subreg-abort.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=hexagon -O2 -disable-cgp < %s
2*9880d681SAndroid Build Coastguard Worker; REQUIRES: asserts
3*9880d681SAndroid Build Coastguard Worker;
4*9880d681SAndroid Build Coastguard Worker; Tail duplication can ignore subregister information on PHI nodes, and as
5*9880d681SAndroid Build Coastguard Worker; a result, generate COPY instructions between registers of different classes.
6*9880d681SAndroid Build Coastguard Worker; This could lead to HexagonInstrInfo::copyPhysReg aborting on an unhandled
7*9880d681SAndroid Build Coastguard Worker; src/dst combination.
8*9880d681SAndroid Build Coastguard Worker;
9*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(i32 %x, i64 %y) nounwind {
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker  %a = icmp slt i32 %x, 0
12*9880d681SAndroid Build Coastguard Worker  %lo = trunc i64 %y to i32
13*9880d681SAndroid Build Coastguard Worker  br i1 %a, label %next, label %tail
14*9880d681SAndroid Build Coastguard Workertail:
15*9880d681SAndroid Build Coastguard Worker  br label %join
16*9880d681SAndroid Build Coastguard Workernext:
17*9880d681SAndroid Build Coastguard Worker  %c = icmp eq i32 %x, 0
18*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %b1, label %tail
19*9880d681SAndroid Build Coastguard Workerb1:
20*9880d681SAndroid Build Coastguard Worker  %t1 = lshr i64 %y, 32
21*9880d681SAndroid Build Coastguard Worker  %hi = trunc i64 %t1 to i32
22*9880d681SAndroid Build Coastguard Worker  br label %join
23*9880d681SAndroid Build Coastguard Workerjoin:
24*9880d681SAndroid Build Coastguard Worker  %val = phi i32 [ %hi, %b1 ], [ %lo, %tail ]
25*9880d681SAndroid Build Coastguard Worker  ret i32 %val
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker
29