summaryrefslogtreecommitdiff
path: root/test/Transforms/TailDup/if-tail-dup.ll
blob: 6a02ac51a37d57bdcae2fcbba427cd3b8e467300 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate | llc -march=x86 | grep 'je ' &&
; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate | llc -march=x86 | not grep jmp
; This should have no unconditional jumps in it.  The C source is:

;void foo(int c, int* P) {
;  if (c & 1)  P[0] = 1;
;  if (c & 2)  P[1] = 1;
;  if (c & 4)  P[2] = 1;
;  if (c & 8)  P[3] = 1;
;}

implementation

void %foo(int %c, int* %P) {
entry:
        %tmp1 = and int %c, 1           ; <int> [#uses=1]
        %tmp1 = seteq int %tmp1, 0              ; <bool> [#uses=1]
        br bool %tmp1, label %cond_next, label %cond_true

cond_true:              ; preds = %entry
        store int 1, int* %P
        br label %cond_next

cond_next:              ; preds = %entry, %cond_true
        %tmp5 = and int %c, 2           ; <int> [#uses=1]
        %tmp5 = seteq int %tmp5, 0              ; <bool> [#uses=1]
        br bool %tmp5, label %cond_next10, label %cond_true6

cond_true6:             ; preds = %cond_next
        %tmp8 = getelementptr int* %P, int 1            ; <int*> [#uses=1]
        store int 1, int* %tmp8
        br label %cond_next10

cond_next10:            ; preds = %cond_next, %cond_true6
        %tmp13 = and int %c, 4          ; <int> [#uses=1]
        %tmp13 = seteq int %tmp13, 0            ; <bool> [#uses=1]
        br bool %tmp13, label %cond_next18, label %cond_true14

cond_true14:            ; preds = %cond_next10
        %tmp16 = getelementptr int* %P, int 2           ; <int*> [#uses=1]
        store int 1, int* %tmp16
        br label %cond_next18

cond_next18:            ; preds = %cond_next10, %cond_true14
        %tmp21 = and int %c, 8          ; <int> [#uses=1]
        %tmp21 = seteq int %tmp21, 0            ; <bool> [#uses=1]
        br bool %tmp21, label %return, label %cond_true22

cond_true22:            ; preds = %cond_next18
        %tmp24 = getelementptr int* %P, int 3           ; <int*> [#uses=1]
        store int 1, int* %tmp24
        ret void

return:         ; preds = %cond_next18
        ret void
}