File: early-ifcvt-remarks.ll

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (135 lines) | stat: -rw-r--r-- 4,476 bytes parent folder | download | duplicates (7)
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc %s -x86-early-ifcvt -pass-remarks='early-ifcvt' -pass-remarks-missed='early-ifcvt' -mcpu=k8 -o - 2>&1 | FileCheck %s
target triple = "x86_64-none-none"

; CHECK: remark: <unknown>:0:0: performing if-conversion on branch:
; CHECK-SAME: the condition adds {{[0-9]+}} cycle{{s?}} to the critical path,
; CHECK-SAME: and the short leg adds another {{[0-9]+}} cycles{{s?}},
; CHECK-SAME: and the long leg adds another {{[0-9]+}} cycles{{s?}},
; CHECK-SAME: each staying under the threshold of {{[0-9]+}} cycles{{s?}}.

; CHECK: remark: <unknown>:0:0: did not if-convert branch:
; CHECK-SAME: the condition would add {{[0-9]+}} cycles{{s?}} to the critical path,
; CHECK-SAME: and the short leg would add another {{[0-9]+}} cycles{{s?}},
; CHECK-SAME: and the long leg would add another {{[0-9]+}} cycles{{s?}} exceeding the limit of {{[0-9]+}} cycles{{s?}}.

; CHECK: remark: <unknown>:0:0: did not if-convert branch:
; CHECK-SAME: the resulting critical path ({{[0-9]+}} cycles{{s?}})
; CHECK-SAME: would extend the shorter leg's critical path ({{[0-9]+}} cycle{{s?}})
; CHECK-SAME: by more than the threshold of {{[0-9]+}} cycles{{s?}},
; CHECK-SAME: which cannot be hidden by available ILP.

define i32 @mm1(i1 %pred, i32 %val) {
; CHECK-LABEL: mm1:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi
; CHECK-NEXT:    leal 1(%rsi), %eax
; CHECK-NEXT:    testb $1, %dil
; CHECK-NEXT:    cmovel %esi, %eax
; CHECK-NEXT:    retq
entry:
  br i1 %pred, label %if.true, label %if.else

if.true:
  %v1 = add i32 1, %val
  br label %if.else

if.else:
  %res = phi i32 [ %val, %entry ], [ %v1, %if.true ]
  ret i32 %res
}

define i32 @mm2(i1 %pred, i32 %val, i32 %e1, i32 %e2, i32 %e3, i32 %e4, i32 %e5) {
; CHECK-LABEL: mm2:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    movl %esi, %eax
; CHECK-NEXT:    testb $1, %dil
; CHECK-NEXT:    je .LBB1_2
; CHECK-NEXT:  # %bb.1: # %if.true
; CHECK-NEXT:    addl %eax, %edx
; CHECK-NEXT:    addl %ecx, %r8d
; CHECK-NEXT:    addl %edx, %r8d
; CHECK-NEXT:    addl %r8d, %r9d
; CHECK-NEXT:    movl %r9d, %eax
; CHECK-NEXT:  .LBB1_2: # %if.else
; CHECK-NEXT:    retq
entry:
  br i1 %pred, label %if.true, label %if.else

if.true:
  %v1 = add i32 %e1, %val
  %v2 = add i32 %e2, %v1
  %v3 = add i32 %e3, %v2
  %v4 = add i32 %e4, %v3
  br label %if.else

if.else:
  %res = phi i32 [ %val, %entry ], [ %v4, %if.true ]
  ret i32 %res
}

define i64 @mm3(i1 %pred, i64 %val, i64 %e1, i128 %e2, i128 %e3, i128 %e4, i128 %e5) {
; CHECK-LABEL: mm3:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    movq %rsi, %rax
; CHECK-NEXT:    testb $1, %dil
; CHECK-NEXT:    movq %rsi, %r10
; CHECK-NEXT:    jne .LBB2_2
; CHECK-NEXT:  # %bb.1: # %if.false
; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %rsi
; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %rdi
; CHECK-NEXT:    imulq %rdx, %rdx
; CHECK-NEXT:    movq %rdx, %r10
; CHECK-NEXT:    sarq $63, %r10
; CHECK-NEXT:    movq %rcx, %rax
; CHECK-NEXT:    movq %rdx, %r9
; CHECK-NEXT:    mulq %rdx
; CHECK-NEXT:    imulq %rcx, %r10
; CHECK-NEXT:    imulq %r9, %r8
; CHECK-NEXT:    addq %rdx, %r8
; CHECK-NEXT:    addq %r10, %r8
; CHECK-NEXT:    addq {{[0-9]+}}(%rsp), %rax
; CHECK-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
; CHECK-NEXT:    xorq {{[0-9]+}}(%rsp), %rdi
; CHECK-NEXT:    xorq %r8, %rdi
; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %r10
; CHECK-NEXT:    xorq %rsi, %r10
; CHECK-NEXT:    xorq %rax, %r10
; CHECK-NEXT:    movq %rdi, %rax
; CHECK-NEXT:    movl %esi, %ecx
; CHECK-NEXT:    sarq %cl, %rax
; CHECK-NEXT:    addq %rdi, %rdi
; CHECK-NEXT:    notb %cl
; CHECK-NEXT:    shlq %cl, %rdi
; CHECK-NEXT:    movl %esi, %ecx
; CHECK-NEXT:    shrq %cl, %r10
; CHECK-NEXT:    orq %rdi, %r10
; CHECK-NEXT:    testb $64, %sil
; CHECK-NEXT:    cmovneq %rax, %r10
; CHECK-NEXT:    movq %r9, %rax
; CHECK-NEXT:  .LBB2_2: # %if.endif
; CHECK-NEXT:    addq %r10, %rax
; CHECK-NEXT:    retq
entry:
  br i1 %pred, label %if.true, label %if.false

if.true:
  br label %if.endif

if.false:
  %f1 = mul i64 %e1, %e1
  %f3 = sext i64 %f1 to i128
  %f4 = mul i128 %e2, %f3
  %f6 = add i128 %e3, %f4
  %f7 = xor i128 %e4, %f6
  %f8 = xor i128 %e5, %f7
  %a1 = ashr i128 %f8, %e5
  %f5 = trunc i128 %a1 to i64
  br label %if.endif

if.endif:
  %r1 = phi i64 [ %val, %if.true ], [ %f1, %if.false ]
  %r2 = phi i64 [ %val, %if.true ], [ %f5, %if.false ]
  %res = add i64 %r1, %r2
  ret i64 %res
}