aboutsummaryrefslogtreecommitdiff
path: root/clang
diff options
context:
space:
mode:
authorwanglei <wanglei@loongson.cn>2024-03-06 10:03:28 +0800
committerTom Stellard <tstellar@redhat.com>2024-03-12 22:01:13 -0700
commit9b9aee16d4dcf1b4af49988ebd7918fa4ce77e44 (patch)
tree936dd9a9c1687fe07db5a61cb2cda47b38674e85 /clang
parenta9ba36c7e7d7fa076f201843e3b826b6c6d7f5ef (diff)
downloadllvm-9b9aee16d4dcf1b4af49988ebd7918fa4ce77e44.zip
llvm-9b9aee16d4dcf1b4af49988ebd7918fa4ce77e44.tar.gz
llvm-9b9aee16d4dcf1b4af49988ebd7918fa4ce77e44.tar.bz2
[Clang][LoongArch] Fix wrong return value type of __iocsrrd_h (#84100)
relate: https://gcc.gnu.org/pipermail/gcc-patches/2024-February/645016.html (cherry picked from commit 2f479b811274fede36535e34ecb545ac22e399c3)
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Headers/larchintrin.h2
-rw-r--r--clang/test/CodeGen/LoongArch/intrinsic-la32.c8
-rw-r--r--clang/test/CodeGen/LoongArch/intrinsic-la64.c8
3 files changed, 9 insertions, 9 deletions
diff --git a/clang/lib/Headers/larchintrin.h b/clang/lib/Headers/larchintrin.h
index a613e5ca..f421829 100644
--- a/clang/lib/Headers/larchintrin.h
+++ b/clang/lib/Headers/larchintrin.h
@@ -156,7 +156,7 @@ extern __inline unsigned char
return (unsigned char)__builtin_loongarch_iocsrrd_b((unsigned int)_1);
}
-extern __inline unsigned char
+extern __inline unsigned short
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
__iocsrrd_h(unsigned int _1) {
return (unsigned short)__builtin_loongarch_iocsrrd_h((unsigned int)_1);
diff --git a/clang/test/CodeGen/LoongArch/intrinsic-la32.c b/clang/test/CodeGen/LoongArch/intrinsic-la32.c
index 6a8d998..eb3f8cb 100644
--- a/clang/test/CodeGen/LoongArch/intrinsic-la32.c
+++ b/clang/test/CodeGen/LoongArch/intrinsic-la32.c
@@ -215,11 +215,11 @@ void cacop_w(unsigned long int a) {
// LA32-LABEL: @iocsrrd_h_result(
// LA32-NEXT: entry:
// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A:%.*]])
+// LA32-NEXT: [[CONV_I:%.*]] = trunc i32 [[TMP0]] to i16
// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A]])
-// LA32-NEXT: [[CONV2:%.*]] = and i32 [[TMP0]], 255
-// LA32-NEXT: [[ADD:%.*]] = add i32 [[TMP1]], [[CONV2]]
-// LA32-NEXT: [[CONV4:%.*]] = trunc i32 [[ADD]] to i16
-// LA32-NEXT: ret i16 [[CONV4]]
+// LA32-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
+// LA32-NEXT: [[CONV3:%.*]] = add i16 [[TMP2]], [[CONV_I]]
+// LA32-NEXT: ret i16 [[CONV3]]
//
unsigned short iocsrrd_h_result(unsigned int a) {
unsigned short b = __iocsrrd_h(a);
diff --git a/clang/test/CodeGen/LoongArch/intrinsic-la64.c b/clang/test/CodeGen/LoongArch/intrinsic-la64.c
index 48b6a7a..50ec358 100644
--- a/clang/test/CodeGen/LoongArch/intrinsic-la64.c
+++ b/clang/test/CodeGen/LoongArch/intrinsic-la64.c
@@ -431,11 +431,11 @@ void loongarch_movgr2fcsr(int a) {
// CHECK-LABEL: @iocsrrd_h_result(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A:%.*]])
+// CHECK-NEXT: [[CONV_I:%.*]] = trunc i32 [[TMP0]] to i16
// CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A]])
-// CHECK-NEXT: [[CONV2:%.*]] = and i32 [[TMP0]], 255
-// CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP1]], [[CONV2]]
-// CHECK-NEXT: [[CONV4:%.*]] = trunc i32 [[ADD]] to i16
-// CHECK-NEXT: ret i16 [[CONV4]]
+// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
+// CHECK-NEXT: [[CONV3:%.*]] = add i16 [[TMP2]], [[CONV_I]]
+// CHECK-NEXT: ret i16 [[CONV3]]
//
unsigned short iocsrrd_h_result(unsigned int a) {
unsigned short b = __iocsrrd_h(a);