Skip to content

Commit c893880

Browse files
committed
[AutoUpgrade] Fix remangling when upgrading struct return type
This was remangling the old function rather than the new one, and could result in failures when we were performing both a struct return upgrade and an opaque pointer upgrade.
1 parent 6ade6d2 commit c893880

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

llvm/lib/IR/AutoUpgrade.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1125,7 +1125,7 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {
11251125
Name, F->getParent());
11261126

11271127
// The new function may also need remangling.
1128-
if (auto Result = llvm::Intrinsic::remangleIntrinsicFunction(F))
1128+
if (auto Result = llvm::Intrinsic::remangleIntrinsicFunction(NewFn))
11291129
NewFn = *Result;
11301130
return true;
11311131
}

llvm/test/Assembler/opaque-ptr-intrinsic-remangling.ll

+19
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
; Make sure that opaque pointer intrinsic remangling upgrade works.
55

6+
%int8x16x2_t = type { <16 x i8>, <16 x i8> }
7+
68
declare i32* @fake_personality_function()
79
declare void @func()
810

@@ -43,5 +45,22 @@ define i8* @test_ptr_annotation(i8* %p) {
4345
ret i8* %p2
4446
}
4547

48+
49+
define void @test_struct_return(%int8x16x2_t* %res.p, i8* %a) {
50+
; CHECK-LABEL: @test_struct_return(
51+
; CHECK-NEXT: [[TMP1:%.*]] = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr [[A:%.*]])
52+
; CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <16 x i8>, <16 x i8> } [[TMP1]], 0
53+
; CHECK-NEXT: [[TMP3:%.*]] = insertvalue [[INT8X16X2_T:%.*]] poison, <16 x i8> [[TMP2]], 0
54+
; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { <16 x i8>, <16 x i8> } [[TMP1]], 1
55+
; CHECK-NEXT: [[TMP5:%.*]] = insertvalue [[INT8X16X2_T]] [[TMP3]], <16 x i8> [[TMP4]], 1
56+
; CHECK-NEXT: store [[INT8X16X2_T]] [[TMP5]], ptr [[RES_P:%.*]], align 16
57+
; CHECK-NEXT: ret void
58+
;
59+
%res = call %int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0i8(i8* %a)
60+
store %int8x16x2_t %res, %int8x16x2_t* %res.p
61+
ret void
62+
}
63+
4664
declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
4765
declare i8* @llvm.ptr.annotation.p0i8(i8*, i8*, i8*, i32, i8*)
66+
declare %int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0i8(i8*)

0 commit comments

Comments
 (0)