1
- ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
- ; RUN: llc < %s -mtriple=i686 -unknown -mcpu=skx | FileCheck %s --check-prefix=X86
3
- ; RUN: llc < %s -mtriple=i686-unknown -mcpu=skx -O0 | FileCheck %s --check-prefix=X86-O0
4
- ; RUN: llc < %s -mtriple=x86_64 -unknown -mcpu=skx | FileCheck %s --check-prefix=X64
5
- ; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=skx -O0 | FileCheck %s --check-prefix=X64-O0
1
+ ; RUN: llc -O0 -mtriple=x86_64-unknown -mcpu=skx -o - %s | FileCheck %s --check-prefixes=CHECK,X64
2
+ ; RUN: llc -mtriple=x86_64 -unknown -mcpu=skx -o - %s | FileCheck %s --check-prefixes=CHECK,X64
3
+ ; RUN: llc -O0 -mtriple=i686-unknown -mcpu=skx -o - %s | FileCheck %s --check-prefixes=CHECK,686
4
+ ; RUN: llc -mtriple=i686 -unknown -mcpu=skx -o - %s | FileCheck %s --check-prefixes=CHECK,686
5
+ ; REQUIRES: asserts
6
6
7
7
@c = external constant i8 , align 1
8
8
9
9
define void @foo () {
10
- ; X86-LABEL: foo:
11
- ; X86: # BB#0: # %entry
12
- ; X86-NEXT: subl $8, %esp
13
- ; X86-NEXT: .Lcfi0:
14
- ; X86-NEXT: .cfi_def_cfa_offset 12
15
- ; X86-NEXT: movzbl c, %eax
16
- ; X86-NEXT: xorl %ecx, %ecx
17
- ; X86-NEXT: testl %eax, %eax
18
- ; X86-NEXT: setne %cl
19
- ; X86-NEXT: testb %al, %al
20
- ; X86-NEXT: setne {{[0-9]+}}(%esp)
21
- ; X86-NEXT: xorl %edx, %edx
22
- ; X86-NEXT: cmpl %eax, %ecx
23
- ; X86-NEXT: setle %dl
24
- ; X86-NEXT: movl %edx, {{[0-9]+}}(%esp)
25
- ; X86-NEXT: addl $8, %esp
26
- ; X86-NEXT: retl
27
- ;
28
- ; X86-O0-LABEL: foo:
29
- ; X86-O0: # BB#0: # %entry
30
- ; X86-O0-NEXT: subl $12, %esp
31
- ; X86-O0-NEXT: .Lcfi0:
32
- ; X86-O0-NEXT: .cfi_def_cfa_offset 16
33
- ; X86-O0-NEXT: movb c, %al
34
- ; X86-O0-NEXT: testb %al, %al
35
- ; X86-O0-NEXT: setne {{[0-9]+}}(%esp)
36
- ; X86-O0-NEXT: movzbl c, %ecx
37
- ; X86-O0-NEXT: testl %ecx, %ecx
38
- ; X86-O0-NEXT: setne %al
39
- ; X86-O0-NEXT: movzbl %al, %edx
40
- ; X86-O0-NEXT: subl %ecx, %edx
41
- ; X86-O0-NEXT: setle %al
42
- ; X86-O0-NEXT: andb $1, %al
43
- ; X86-O0-NEXT: movzbl %al, %ecx
44
- ; X86-O0-NEXT: movl %ecx, {{[0-9]+}}(%esp)
45
- ; X86-O0-NEXT: movl %edx, (%esp) # 4-byte Spill
46
- ; X86-O0-NEXT: addl $12, %esp
47
- ; X86-O0-NEXT: retl
48
- ;
49
- ; X64-LABEL: foo:
50
- ; X64: # BB#0: # %entry
51
- ; X64-NEXT: movzbl {{.*}}(%rip), %eax
52
- ; X64-NEXT: testb %al, %al
53
- ; X64-NEXT: setne -{{[0-9]+}}(%rsp)
54
- ; X64-NEXT: xorl %ecx, %ecx
55
- ; X64-NEXT: testl %eax, %eax
56
- ; X64-NEXT: setne %cl
57
- ; X64-NEXT: xorl %edx, %edx
58
- ; X64-NEXT: cmpl %eax, %ecx
59
- ; X64-NEXT: setle %dl
60
- ; X64-NEXT: movl %edx, -{{[0-9]+}}(%rsp)
61
- ; X64-NEXT: retq
62
- ;
63
- ; X64-O0-LABEL: foo:
64
- ; X64-O0: # BB#0: # %entry
65
- ; X64-O0-NEXT: movb {{.*}}(%rip), %al
66
- ; X64-O0-NEXT: testb %al, %al
67
- ; X64-O0-NEXT: setne -{{[0-9]+}}(%rsp)
68
- ; X64-O0-NEXT: movzbl {{.*}}(%rip), %ecx
69
- ; X64-O0-NEXT: testl %ecx, %ecx
70
- ; X64-O0-NEXT: setne %al
71
- ; X64-O0-NEXT: movzbl %al, %edx
72
- ; X64-O0-NEXT: subl %ecx, %edx
73
- ; X64-O0-NEXT: setle %al
74
- ; X64-O0-NEXT: andb $1, %al
75
- ; X64-O0-NEXT: movzbl %al, %ecx
76
- ; X64-O0-NEXT: movl %ecx, -{{[0-9]+}}(%rsp)
77
- ; X64-O0-NEXT: movl %edx, -{{[0-9]+}}(%rsp) # 4-byte Spill
78
- ; X64-O0-NEXT: retq
10
+ ; CHECK-LABEL: foo:
11
+ ; CHECK: # BB#0: # %entry
12
+ ; CHECK-DAG: setne
13
+ ; CHECK-DAG: setle
14
+ ; CHECK: ret
79
15
entry:
80
16
%a = alloca i8 , align 1
81
17
%b = alloca i32 , align 4
@@ -100,3 +36,125 @@ entry:
100
36
store i32 %conv8 , i32* %b , align 4
101
37
ret void
102
38
}
39
+
40
+ @var_5 = external global i32 , align 4
41
+ @var_57 = external global i64 , align 8
42
+ @_ZN8struct_210member_2_0E = external global i64 , align 8
43
+
44
+ define void @f1 () {
45
+ ; CHECK-LABEL: f1:
46
+ ; CHECK: # BB#0: # %entry
47
+ ; CHECK: sete
48
+ ; X64: addq $7093, {{.*}}
49
+ ; 686: addl $7093, {{.*}}
50
+ ; CHECK: ret
51
+ entry:
52
+ %a = alloca i8 , align 1
53
+ %0 = load i32 , i32* @var_5 , align 4
54
+ %conv = sext i32 %0 to i64
55
+ %add = add nsw i64 %conv , 8381627093
56
+ %tobool = icmp ne i64 %add , 0
57
+ %frombool = zext i1 %tobool to i8
58
+ store i8 %frombool , i8* %a , align 1
59
+ %1 = load i32 , i32* @var_5 , align 4
60
+ %neg = xor i32 %1 , -1
61
+ %tobool1 = icmp ne i32 %neg , 0
62
+ %lnot = xor i1 %tobool1 , true
63
+ %conv2 = zext i1 %lnot to i64
64
+ %2 = load i32 , i32* @var_5 , align 4
65
+ %conv3 = sext i32 %2 to i64
66
+ %add4 = add nsw i64 %conv3 , 7093
67
+ %cmp = icmp sgt i64 %conv2 , %add4
68
+ %conv5 = zext i1 %cmp to i64
69
+ store i64 %conv5 , i64* @var_57 , align 8
70
+ %3 = load i32 , i32* @var_5 , align 4
71
+ %neg6 = xor i32 %3 , -1
72
+ %tobool7 = icmp ne i32 %neg6 , 0
73
+ %lnot8 = xor i1 %tobool7 , true
74
+ %conv9 = zext i1 %lnot8 to i64
75
+ store i64 %conv9 , i64* @_ZN8struct_210member_2_0E , align 8
76
+ ret void
77
+ }
78
+
79
+
80
+ @var_7 = external global i8 , align 1
81
+
82
+ define void @f2 () {
83
+ ; CHECK-LABEL: f2:
84
+ ; CHECK: # BB#0: # %entry
85
+ ; X64: movzbl {{.*}}(%rip), %[[R:[a-z]*]]
86
+ ; 686: movzbl {{.*}}, %[[R:[a-z]*]]
87
+ ; CHECK: test{{[qlwb]}} %[[R]], %[[R]]
88
+ ; CHECK: sete {{.*}}
89
+ ; CHECK: ret
90
+ entry:
91
+ %a = alloca i16 , align 2
92
+ %0 = load i8 , i8* @var_7 , align 1
93
+ %conv = zext i8 %0 to i32
94
+ %1 = load i8 , i8* @var_7 , align 1
95
+ %tobool = icmp ne i8 %1 , 0
96
+ %lnot = xor i1 %tobool , true
97
+ %conv1 = zext i1 %lnot to i32
98
+ %xor = xor i32 %conv , %conv1
99
+ %conv2 = trunc i32 %xor to i16
100
+ store i16 %conv2 , i16* %a , align 2
101
+ %2 = load i8 , i8* @var_7 , align 1
102
+ %conv3 = zext i8 %2 to i16
103
+ %tobool4 = icmp ne i16 %conv3 , 0
104
+ %lnot5 = xor i1 %tobool4 , true
105
+ %conv6 = zext i1 %lnot5 to i32
106
+ %3 = load i8 , i8* @var_7 , align 1
107
+ %conv7 = zext i8 %3 to i32
108
+ %cmp = icmp eq i32 %conv6 , %conv7
109
+ %conv8 = zext i1 %cmp to i32
110
+ %conv9 = trunc i32 %conv8 to i16
111
+ store i16 %conv9 , i16* undef , align 2
112
+ ret void
113
+ }
114
+
115
+
116
+ @var_13 = external global i32 , align 4
117
+ @var_16 = external global i32 , align 4
118
+ @var_46 = external global i32 , align 4
119
+
120
+ define void @f3 () #0 {
121
+ ; CHECK-LABEL: f3:
122
+ ; X64-DAG: movl var_13(%rip), {{.*}}
123
+ ; X64-DAG: movl var_16(%rip), {{.*}}
124
+ ; X64-DAG: movl {{.*}},{{.*}}var_46{{.*}}
125
+ ; X64: retq
126
+ ; 686-DAG: movl var_13, {{.*}}
127
+ ; 686-DAG: movl var_16, {{.*}}
128
+ ; 686-DAG: movl {{.*}},{{.*}}var_46{{.*}}
129
+ ; 686: retl
130
+ entry:
131
+ %a = alloca i64 , align 8
132
+ %0 = load i32 , i32* @var_13 , align 4
133
+ %neg = xor i32 %0 , -1
134
+ %conv = zext i32 %neg to i64
135
+ %1 = load i32 , i32* @var_13 , align 4
136
+ %tobool = icmp ne i32 %1 , 0
137
+ %lnot = xor i1 %tobool , true
138
+ %conv1 = zext i1 %lnot to i64
139
+ %2 = load i32 , i32* @var_13 , align 4
140
+ %neg2 = xor i32 %2 , -1
141
+ %3 = load i32 , i32* @var_16 , align 4
142
+ %xor = xor i32 %neg2 , %3
143
+ %conv3 = zext i32 %xor to i64
144
+ %and = and i64 %conv1 , %conv3
145
+ %or = or i64 %conv , %and
146
+ store i64 %or , i64* %a , align 8
147
+ %4 = load i32 , i32* @var_13 , align 4
148
+ %neg4 = xor i32 %4 , -1
149
+ %conv5 = zext i32 %neg4 to i64
150
+ %5 = load i32 , i32* @var_13 , align 4
151
+ %tobool6 = icmp ne i32 %5 , 0
152
+ %lnot7 = xor i1 %tobool6 , true
153
+ %conv8 = zext i1 %lnot7 to i64
154
+ %and9 = and i64 %conv8 , 0
155
+ %or10 = or i64 %conv5 , %and9
156
+ %conv11 = trunc i64 %or10 to i32
157
+ store i32 %conv11 , i32* @var_46 , align 4
158
+ ret void
159
+ }
160
+
0 commit comments