Skip to content

Commit 3f3629c

Browse files
author
git apple-llvm automerger
committed
Merge commit '5c21269d3632' from apple/master into swift/master-next
2 parents b45529f + 5c21269 commit 3f3629c

File tree

3 files changed

+52
-13
lines changed

3 files changed

+52
-13
lines changed

llvm/lib/Target/AArch64/AArch64FastISel.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3844,11 +3844,6 @@ bool AArch64FastISel::selectRet(const Instruction *I) {
38443844
if (!FuncInfo.CanLowerReturn)
38453845
return false;
38463846

3847-
// FIXME: in principle it could. Mostly just a case of zero extending outgoing
3848-
// pointers.
3849-
if (Subtarget->isTargetILP32())
3850-
return false;
3851-
38523847
if (F.isVarArg())
38533848
return false;
38543849

@@ -3928,6 +3923,11 @@ bool AArch64FastISel::selectRet(const Instruction *I) {
39283923
return false;
39293924
}
39303925

3926+
// "Callee" (i.e. value producer) zero extends pointers at function
3927+
// boundary.
3928+
if (Subtarget->isTargetILP32() && RV->getType()->isPointerTy())
3929+
SrcReg = emitAnd_ri(MVT::i64, SrcReg, false, 0xffffffff);
3930+
39313931
// Make the copy.
39323932
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
39333933
TII.get(TargetOpcode::COPY), DestReg).addReg(SrcReg);
@@ -5017,6 +5017,9 @@ std::pair<unsigned, bool> AArch64FastISel::getRegForGEPIndex(const Value *Idx) {
50175017
/// simple cases. This is because the standard fastEmit functions don't cover
50185018
/// MUL at all and ADD is lowered very inefficientily.
50195019
bool AArch64FastISel::selectGetElementPtr(const Instruction *I) {
5020+
if (Subtarget->isTargetILP32())
5021+
return false;
5022+
50205023
unsigned N = getRegForValue(I->getOperand(0));
50215024
if (!N)
50225025
return false;

llvm/test/CodeGen/AArch64/arm64_32-fastisel.ll

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,24 @@ define void @test_struct_return(i32* %addr) {
2626
store i32 %res.1, i32* %addr
2727
ret void
2828
}
29+
30+
define i8* @test_ret_ptr(i64 %in) {
31+
; CHECK-LABEL: test_ret_ptr:
32+
; CHECK: add [[TMP:x[0-9]]], x0, #1
33+
; CHECK: and x0, [[TMP]], #0xffffffff
34+
35+
%sum = add i64 %in, 1
36+
%res = inttoptr i64 %sum to i8*
37+
ret i8* %res
38+
}
39+
40+
; Handled by SDAG because the struct confuses FastISel, which is fine.
41+
define {i8*} @test_ret_ptr_struct(i64 %in) {
42+
; CHECK-LABEL: test_ret_ptr_struct:
43+
; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, #1
44+
45+
%sum = add i64 %in, 1
46+
%res.ptr = inttoptr i64 %sum to i8*
47+
%res = insertvalue {i8*} undef, i8* %res.ptr, 0
48+
ret {i8*} %res
49+
}

llvm/test/CodeGen/AArch64/arm64_32.ll

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
define i32* @test_global_addr() {
1616
; CHECK-LABEL: test_global_addr:
1717
; CHECK: adrp [[PAGE:x[0-9]+]], _var32@PAGE
18-
; CHECK: add x0, [[PAGE]], _var32@PAGEOFF
18+
; CHECK-OPT: add x0, [[PAGE]], _var32@PAGEOFF
19+
; CHECK-FAST: add [[TMP:x[0-9]+]], [[PAGE]], _var32@PAGEOFF
20+
; CHECK-FAST: and x0, [[TMP]], #0xffffffff
1921
ret i32* @var32
2022
}
2123

@@ -156,7 +158,9 @@ define i32 @test_unsafe_negative_unscaled_add() {
156158
define i8* @test_got_addr() {
157159
; CHECK-LABEL: test_got_addr:
158160
; CHECK: adrp x[[PAGE:[0-9]+]], _var_got@GOTPAGE
159-
; CHECK: ldr w0, [x[[PAGE]], _var_got@GOTPAGEOFF]
161+
; CHECK-OPT: ldr w0, [x[[PAGE]], _var_got@GOTPAGEOFF]
162+
; CHECK-FAST: ldr w[[TMP:[0-9]+]], [x[[PAGE]], _var_got@GOTPAGEOFF]
163+
; CHECK-FAST: and x0, x[[TMP]], #0xffffffff
160164
ret i8* @var_got
161165
}
162166

@@ -229,7 +233,9 @@ declare i8* @llvm.frameaddress(i32)
229233

230234
define i8* @test_frameaddr() {
231235
; CHECK-LABEL: test_frameaddr:
232-
; CHECK: ldr {{w0|x0}}, [x29]
236+
; CHECK-OPT: ldr x0, [x29]
237+
; CHECK-FAST: ldr [[TMP:x[0-9]+]], [x29]
238+
; CHECK-FAST: and x0, [[TMP]], #0xffffffff
233239
%val = call i8* @llvm.frameaddress(i32 1)
234240
ret i8* %val
235241
}
@@ -238,15 +244,18 @@ declare i8* @llvm.returnaddress(i32)
238244

239245
define i8* @test_toplevel_returnaddr() {
240246
; CHECK-LABEL: test_toplevel_returnaddr:
241-
; CHECK: mov x0, x30
247+
; CHECK-OPT: mov x0, x30
248+
; CHECK-FAST: and x0, x30, #0xffffffff
242249
%val = call i8* @llvm.returnaddress(i32 0)
243250
ret i8* %val
244251
}
245252

246253
define i8* @test_deep_returnaddr() {
247254
; CHECK-LABEL: test_deep_returnaddr:
248255
; CHECK: ldr x[[FRAME_REC:[0-9]+]], [x29]
249-
; CHECK: ldr x0, [x[[FRAME_REC]], #8]
256+
; CHECK-OPT: ldr x0, [x[[FRAME_REC]], #8]
257+
; CHECK-FAST: ldr [[TMP:x[0-9]+]], [x[[FRAME_REC]], #8]
258+
; CHECK-FAST: and x0, [[TMP]], #0xffffffff
250259
%val = call i8* @llvm.returnaddress(i32 1)
251260
ret i8* %val
252261
}
@@ -651,6 +660,7 @@ define void @test_struct_hi(i32 %hi) nounwind {
651660
; CHECK-LABEL: test_struct_hi:
652661
; CHECK: mov w[[IN:[0-9]+]], w0
653662
; CHECK: bl _get_int
663+
; CHECK-FAST-NEXT: mov w0, w0
654664
; CHECK-NEXT: bfi x0, x[[IN]], #32, #32
655665
; CHECK-NEXT: bl _take_pair
656666
%val.64 = call i64 @get_int()
@@ -691,9 +701,14 @@ false:
691701

692702
define { [18 x i8] }* @test_gep_nonpow2({ [18 x i8] }* %a0, i32 %a1) {
693703
; CHECK-LABEL: test_gep_nonpow2:
694-
; CHECK: mov w[[SIZE:[0-9]+]], #18
695-
; CHECK-NEXT: smaddl x0, w1, w[[SIZE]], x0
696-
; CHECK-NEXT: ret
704+
; CHECK-OPT: mov w[[SIZE:[0-9]+]], #18
705+
; CHECK-OPT-NEXT: smaddl x0, w1, w[[SIZE]], x0
706+
; CHECK-OPT-NEXT: ret
707+
708+
; CHECK-FAST: mov w[[SIZE:[0-9]+]], #18
709+
; CHECK-FAST-NEXT: smaddl [[TMP:x[0-9]+]], w1, w[[SIZE]], x0
710+
; CHECK-FAST-NEXT: and x0, [[TMP]], #0xffffffff
711+
; CHECK-FAST-NEXT: ret
697712
%tmp0 = getelementptr inbounds { [18 x i8] }, { [18 x i8] }* %a0, i32 %a1
698713
ret { [18 x i8] }* %tmp0
699714
}

0 commit comments

Comments
 (0)