1- // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm < %s| FileCheck %s
1+ // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+ // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-X86
3+ // RUN: %clang_cc1 -triple riscv64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-RV64
24
5+ #ifdef __x86_64__
36// Test that we have the structure definition, the gep offsets, the name of the
47// global, the bit grab, and the icmp correct.
58extern void a (const char * );
69
710// CHECK: @__cpu_model = external dso_local global { i32, i32, i32, [1 x i32] }
811
12+ // CHECK-X86-LABEL: define dso_local void @intel(
13+ // CHECK-X86-SAME: ) #[[ATTR0:[0-9]+]] {
14+ // CHECK-X86-NEXT: [[ENTRY:.*:]]
15+ // CHECK-X86-NEXT: [[TMP0:%.*]] = load i32, ptr @__cpu_model, align 4
16+ // CHECK-X86-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 1
17+ // CHECK-X86-NEXT: br i1 [[TMP1]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
18+ // CHECK-X86: [[IF_THEN]]:
19+ // CHECK-X86-NEXT: call void @a(ptr noundef @.str)
20+ // CHECK-X86-NEXT: br label %[[IF_END]]
21+ // CHECK-X86: [[IF_END]]:
22+ // CHECK-X86-NEXT: ret void
23+ //
924void intel (void ) {
1025 if (__builtin_cpu_is ("intel" ))
1126 a ("intel" );
@@ -14,6 +29,18 @@ void intel(void) {
1429 // CHECK: = icmp eq i32 [[LOAD]], 1
1530}
1631
32+ // CHECK-X86-LABEL: define dso_local void @amd(
33+ // CHECK-X86-SAME: ) #[[ATTR0]] {
34+ // CHECK-X86-NEXT: [[ENTRY:.*:]]
35+ // CHECK-X86-NEXT: [[TMP0:%.*]] = load i32, ptr @__cpu_model, align 4
36+ // CHECK-X86-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 2
37+ // CHECK-X86-NEXT: br i1 [[TMP1]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
38+ // CHECK-X86: [[IF_THEN]]:
39+ // CHECK-X86-NEXT: call void @a(ptr noundef @.str.1)
40+ // CHECK-X86-NEXT: br label %[[IF_END]]
41+ // CHECK-X86: [[IF_END]]:
42+ // CHECK-X86-NEXT: ret void
43+ //
1744void amd (void ) {
1845 if (__builtin_cpu_is ("amd" ))
1946 a ("amd" );
@@ -22,6 +49,18 @@ void amd(void) {
2249 // CHECK: = icmp eq i32 [[LOAD]], 2
2350}
2451
52+ // CHECK-X86-LABEL: define dso_local void @atom(
53+ // CHECK-X86-SAME: ) #[[ATTR0]] {
54+ // CHECK-X86-NEXT: [[ENTRY:.*:]]
55+ // CHECK-X86-NEXT: [[TMP0:%.*]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 1), align 4
56+ // CHECK-X86-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 1
57+ // CHECK-X86-NEXT: br i1 [[TMP1]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
58+ // CHECK-X86: [[IF_THEN]]:
59+ // CHECK-X86-NEXT: call void @a(ptr noundef @.str.2)
60+ // CHECK-X86-NEXT: br label %[[IF_END]]
61+ // CHECK-X86: [[IF_END]]:
62+ // CHECK-X86-NEXT: ret void
63+ //
2564void atom (void ) {
2665 if (__builtin_cpu_is ("atom" ))
2766 a ("atom" );
@@ -30,6 +69,18 @@ void atom(void) {
3069 // CHECK: = icmp eq i32 [[LOAD]], 1
3170}
3271
72+ // CHECK-X86-LABEL: define dso_local void @amdfam10h(
73+ // CHECK-X86-SAME: ) #[[ATTR0]] {
74+ // CHECK-X86-NEXT: [[ENTRY:.*:]]
75+ // CHECK-X86-NEXT: [[TMP0:%.*]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 1), align 4
76+ // CHECK-X86-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 4
77+ // CHECK-X86-NEXT: br i1 [[TMP1]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
78+ // CHECK-X86: [[IF_THEN]]:
79+ // CHECK-X86-NEXT: call void @a(ptr noundef @.str.3)
80+ // CHECK-X86-NEXT: br label %[[IF_END]]
81+ // CHECK-X86: [[IF_END]]:
82+ // CHECK-X86-NEXT: ret void
83+ //
3384void amdfam10h (void ) {
3485 if (__builtin_cpu_is ("amdfam10h" ))
3586 a ("amdfam10h" );
@@ -38,6 +89,18 @@ void amdfam10h(void) {
3889 // CHECK: = icmp eq i32 [[LOAD]], 4
3990}
4091
92+ // CHECK-X86-LABEL: define dso_local void @barcelona(
93+ // CHECK-X86-SAME: ) #[[ATTR0]] {
94+ // CHECK-X86-NEXT: [[ENTRY:.*:]]
95+ // CHECK-X86-NEXT: [[TMP0:%.*]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 2), align 4
96+ // CHECK-X86-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 4
97+ // CHECK-X86-NEXT: br i1 [[TMP1]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
98+ // CHECK-X86: [[IF_THEN]]:
99+ // CHECK-X86-NEXT: call void @a(ptr noundef @.str.4)
100+ // CHECK-X86-NEXT: br label %[[IF_END]]
101+ // CHECK-X86: [[IF_END]]:
102+ // CHECK-X86-NEXT: ret void
103+ //
41104void barcelona (void ) {
42105 if (__builtin_cpu_is ("barcelona" ))
43106 a ("barcelona" );
@@ -46,10 +109,56 @@ void barcelona(void) {
46109 // CHECK: = icmp eq i32 [[LOAD]], 4
47110}
48111
112+ // CHECK-X86-LABEL: define dso_local void @nehalem(
113+ // CHECK-X86-SAME: ) #[[ATTR0]] {
114+ // CHECK-X86-NEXT: [[ENTRY:.*:]]
115+ // CHECK-X86-NEXT: [[TMP0:%.*]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 2), align 4
116+ // CHECK-X86-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 1
117+ // CHECK-X86-NEXT: br i1 [[TMP1]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
118+ // CHECK-X86: [[IF_THEN]]:
119+ // CHECK-X86-NEXT: call void @a(ptr noundef @.str.5)
120+ // CHECK-X86-NEXT: br label %[[IF_END]]
121+ // CHECK-X86: [[IF_END]]:
122+ // CHECK-X86-NEXT: ret void
123+ //
49124void nehalem (void ) {
50125 if (__builtin_cpu_is ("nehalem" ))
51126 a ("nehalem" );
52127
53128 // CHECK: [[LOAD:%[^ ]+]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 2)
54129 // CHECK: = icmp eq i32 [[LOAD]], 1
55130}
131+ #endif
132+
133+ #ifdef __riscv
134+ // CHECK-RV64-LABEL: define dso_local signext i32 @test_riscv(
135+ // CHECK-RV64-SAME: i32 noundef signext [[A:%.*]]) #[[ATTR0:[0-9]+]] {
136+ // CHECK-RV64-NEXT: [[ENTRY:.*:]]
137+ // CHECK-RV64-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
138+ // CHECK-RV64-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
139+ // CHECK-RV64-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
140+ // CHECK-RV64-NEXT: [[TMP0:%.*]] = load i32, ptr @__riscv_cpu_model, align 4
141+ // CHECK-RV64-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 1567
142+ // CHECK-RV64-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr inbounds ({ i32, i64, i64 }, ptr @__riscv_cpu_model, i32 0, i32 1), align 8
143+ // CHECK-RV64-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], -9223372036854710272
144+ // CHECK-RV64-NEXT: [[TMP4:%.*]] = and i1 [[TMP1]], [[TMP3]]
145+ // CHECK-RV64-NEXT: [[TMP5:%.*]] = load i64, ptr getelementptr inbounds ({ i32, i64, i64 }, ptr @__riscv_cpu_model, i32 0, i32 2), align 8
146+ // CHECK-RV64-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 273
147+ // CHECK-RV64-NEXT: [[TMP7:%.*]] = and i1 [[TMP4]], [[TMP6]]
148+ // CHECK-RV64-NEXT: br i1 [[TMP7]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
149+ // CHECK-RV64: [[IF_THEN]]:
150+ // CHECK-RV64-NEXT: store i32 3, ptr [[RETVAL]], align 4
151+ // CHECK-RV64-NEXT: br label %[[RETURN:.*]]
152+ // CHECK-RV64: [[IF_END]]:
153+ // CHECK-RV64-NEXT: store i32 0, ptr [[RETVAL]], align 4
154+ // CHECK-RV64-NEXT: br label %[[RETURN]]
155+ // CHECK-RV64: [[RETURN]]:
156+ // CHECK-RV64-NEXT: [[TMP8:%.*]] = load i32, ptr [[RETVAL]], align 4
157+ // CHECK-RV64-NEXT: ret i32 [[TMP8]]
158+ //
159+ int test_riscv (int a ) {
160+ if (__builtin_cpu_is ("veyron-v1" ))
161+ return 3 ;
162+ return 0 ;
163+ }
164+ #endif
0 commit comments