xref: /aosp_15_r20/external/llvm/test/CodeGen/Hexagon/ifcvt-edge-weight.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=hexagon -mcpu=hexagonv5 -hexagon-eif=0 -print-machineinstrs=if-converter %s -o /dev/null 2>&1 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; Check that the edge weights are updated correctly after if-conversion.
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; CHECK: BB#3:
5*9880d681SAndroid Build Coastguard Worker; CHECK: Successors according to CFG: BB#2({{[0-9a-fx/= ]+}}10.00%) BB#1({{[0-9a-fx/= ]+}}90.00%)
6*9880d681SAndroid Build Coastguard Worker@a = external global i32
7*9880d681SAndroid Build Coastguard Worker@d = external global i32
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; In the following CFG, A,B,C,D will be if-converted into a single block.
10*9880d681SAndroid Build Coastguard Worker; Check if the edge weights on edges to E and F are maintained correctly.
11*9880d681SAndroid Build Coastguard Worker;
12*9880d681SAndroid Build Coastguard Worker;    A
13*9880d681SAndroid Build Coastguard Worker;   / \
14*9880d681SAndroid Build Coastguard Worker;  B   C
15*9880d681SAndroid Build Coastguard Worker;   \ /
16*9880d681SAndroid Build Coastguard Worker;    D
17*9880d681SAndroid Build Coastguard Worker;   / \
18*9880d681SAndroid Build Coastguard Worker;  E   F
19*9880d681SAndroid Build Coastguard Worker;
20*9880d681SAndroid Build Coastguard Workerdefine void @test1(i8 zeroext %la, i8 zeroext %lb) {
21*9880d681SAndroid Build Coastguard Workerentry:
22*9880d681SAndroid Build Coastguard Worker  %cmp0 = call i1 @pred()
23*9880d681SAndroid Build Coastguard Worker  br i1 %cmp0, label %if.else2, label %if.then0, !prof !1
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerif.else2:
26*9880d681SAndroid Build Coastguard Worker  call void @bar(i32 2)
27*9880d681SAndroid Build Coastguard Worker  br label %if.end2
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerif.end2:
30*9880d681SAndroid Build Coastguard Worker  call void @foo(i32 2)
31*9880d681SAndroid Build Coastguard Worker  br label %return
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerif.end:
34*9880d681SAndroid Build Coastguard Worker  %storemerge = phi i32 [ %and, %if.else ], [ %shl, %if.then ]
35*9880d681SAndroid Build Coastguard Worker  store i32 %storemerge, i32* @a, align 4
36*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @d, align 4
37*9880d681SAndroid Build Coastguard Worker  %cmp2 = call i1 @pred()
38*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %if.end2, label %if.else2, !prof !2
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerif.then0:
41*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %la, %lb
42*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.else, !prof !1
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerif.then:
45*9880d681SAndroid Build Coastguard Worker  %conv1 = zext i8 %la to i32
46*9880d681SAndroid Build Coastguard Worker  %shl = shl nuw nsw i32 %conv1, 16
47*9880d681SAndroid Build Coastguard Worker  br label %if.end
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerif.else:
50*9880d681SAndroid Build Coastguard Worker  %and8 = and i8 %lb, %la
51*9880d681SAndroid Build Coastguard Worker  %and = zext i8 %and8 to i32
52*9880d681SAndroid Build Coastguard Worker  br label %if.end
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerreturn:
55*9880d681SAndroid Build Coastguard Worker  call void @foo(i32 2)
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32)
60*9880d681SAndroid Build Coastguard Workerdeclare void @bar(i32)
61*9880d681SAndroid Build Coastguard Workerdeclare i1 @pred()
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 80, i32 20}
64*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 10, i32 90}
65