Skip to content

Commit 2e64d18

Browse files
wangleiatllvmbot
authored andcommitted
[Clang][LoongArch] Fix wrong return value type of __iocsrrd_h (llvm#84100)
relate: https://gcc.gnu.org/pipermail/gcc-patches/2024-February/645016.html (cherry picked from commit 2f479b8)
1 parent a31f312 commit 2e64d18

File tree

3 files changed

+9
-9
lines changed

3 files changed

+9
-9
lines changed

clang/lib/Headers/larchintrin.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ extern __inline unsigned char
156156
return (unsigned char)__builtin_loongarch_iocsrrd_b((unsigned int)_1);
157157
}
158158

159-
extern __inline unsigned char
159+
extern __inline unsigned short
160160
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
161161
__iocsrrd_h(unsigned int _1) {
162162
return (unsigned short)__builtin_loongarch_iocsrrd_h((unsigned int)_1);

clang/test/CodeGen/LoongArch/intrinsic-la32.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,11 +215,11 @@ void cacop_w(unsigned long int a) {
215215
// LA32-LABEL: @iocsrrd_h_result(
216216
// LA32-NEXT: entry:
217217
// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A:%.*]])
218+
// LA32-NEXT: [[CONV_I:%.*]] = trunc i32 [[TMP0]] to i16
218219
// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A]])
219-
// LA32-NEXT: [[CONV2:%.*]] = and i32 [[TMP0]], 255
220-
// LA32-NEXT: [[ADD:%.*]] = add i32 [[TMP1]], [[CONV2]]
221-
// LA32-NEXT: [[CONV4:%.*]] = trunc i32 [[ADD]] to i16
222-
// LA32-NEXT: ret i16 [[CONV4]]
220+
// LA32-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
221+
// LA32-NEXT: [[CONV3:%.*]] = add i16 [[TMP2]], [[CONV_I]]
222+
// LA32-NEXT: ret i16 [[CONV3]]
223223
//
224224
unsigned short iocsrrd_h_result(unsigned int a) {
225225
unsigned short b = __iocsrrd_h(a);

clang/test/CodeGen/LoongArch/intrinsic-la64.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -431,11 +431,11 @@ void loongarch_movgr2fcsr(int a) {
431431
// CHECK-LABEL: @iocsrrd_h_result(
432432
// CHECK-NEXT: entry:
433433
// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A:%.*]])
434+
// CHECK-NEXT: [[CONV_I:%.*]] = trunc i32 [[TMP0]] to i16
434435
// CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A]])
435-
// CHECK-NEXT: [[CONV2:%.*]] = and i32 [[TMP0]], 255
436-
// CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP1]], [[CONV2]]
437-
// CHECK-NEXT: [[CONV4:%.*]] = trunc i32 [[ADD]] to i16
438-
// CHECK-NEXT: ret i16 [[CONV4]]
436+
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
437+
// CHECK-NEXT: [[CONV3:%.*]] = add i16 [[TMP2]], [[CONV_I]]
438+
// CHECK-NEXT: ret i16 [[CONV3]]
439439
//
440440
unsigned short iocsrrd_h_result(unsigned int a) {
441441
unsigned short b = __iocsrrd_h(a);

0 commit comments

Comments
 (0)