Skip to content

Commit 7f32d70

Browse files
committed
[AIX] Handle arbitrary sized integers when lowering formal arguments passed on the stack
1 parent 149aa76 commit 7f32d70

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7296,9 +7296,19 @@ SDValue PPCTargetLowering::LowerFormalArguments_AIX(
72967296
if (!ArgVT.isVector() && !ValVT.isVector() && ArgVT.isInteger() &&
72977297
ValVT.isInteger() &&
72987298
ArgVT.getScalarSizeInBits() < ValVT.getScalarSizeInBits()) {
7299-
SDValue ArgValueTrunc = DAG.getNode(
7300-
ISD::TRUNCATE, dl, ArgVT.getSimpleVT() == MVT::i1 ? MVT::i8 : ArgVT,
7301-
ArgValue);
7299+
// It is possible to have either real integer values that aren't
7300+
// the power of two sizes, or integers that were not originally
7301+
// integers. In the latter case, these could have came from structs,
7302+
// and these integers would not have an extend on the parameter.
7303+
// Since these types of integers do not have an extend specified
7304+
// in the first place, the type of extend that we do should not matter.
7305+
EVT TruncatedArgVT;
7306+
if (ArgVT.isSimple())
7307+
TruncatedArgVT = ArgVT.getSimpleVT() == MVT::i1 ? MVT::i8 : ArgVT;
7308+
else
7309+
TruncatedArgVT = ArgVT;
7310+
SDValue ArgValueTrunc =
7311+
DAG.getNode(ISD::TRUNCATE, dl, TruncatedArgVT, ArgValue);
73027312
SDValue ArgValueExt =
73037313
ArgSignExt ? DAG.getSExtOrTrunc(ArgValueTrunc, dl, ValVT)
73047314
: DAG.getZExtOrTrunc(ArgValueTrunc, dl, ValVT);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc --verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff \
3+
; RUN: -mcpu=pwr8 < %s | FileCheck %s --check-prefixes=CHECK,CHECK32
4+
; RUN: llc --verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff \
5+
; RUN: -mcpu=pwr8 < %s | FileCheck %s --check-prefixes=CHECK,CHECK64
6+
7+
define ptr @lower_args(ptr %_0, i32 %0, i32 %1, i32 %2, i32 %3, ptr %4, ptr %5, i64 %6, i24 %7) {
8+
; CHECK-LABEL: lower_args:
9+
; CHECK: # %bb.0: # %entry
10+
; CHECK-NEXT: blr
11+
entry:
12+
ret ptr %_0
13+
}
14+
15+
define i32 @lower_args2(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i24 %i) {
16+
; CHECK32-LABEL: lower_args2:
17+
; CHECK32: # %bb.0: # %entry
18+
; CHECK32-NEXT: lwz 3, 56(1)
19+
; CHECK32-NEXT: addi 3, 3, 255
20+
; CHECK32-NEXT: clrlwi 3, 3, 8
21+
; CHECK32-NEXT: blr
22+
;
23+
; CHECK64-LABEL: lower_args2:
24+
; CHECK64: # %bb.0: # %entry
25+
; CHECK64-NEXT: lwz 3, 116(1)
26+
; CHECK64-NEXT: addi 3, 3, 255
27+
; CHECK64-NEXT: clrldi 3, 3, 40
28+
; CHECK64-NEXT: blr
29+
entry:
30+
%0 = add i24 %i, 255
31+
%1 = zext i24 %0 to i32
32+
ret i32 %1
33+
}

0 commit comments

Comments
 (0)