[PATCH] D120329: [SelectionDAG] Emit calls to __divei4 and friends for division/remainder of large integers
Phoebe Wang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 14 07:35:37 PDT 2022
pengfei added inline comments.
================
Comment at: llvm/test/CodeGen/X86/udivmodei5.ll:5
+
+define i129 @udiv129(i129 %a, i129 %b) {
+; X86-LABEL: udiv129:
----------------
LuoYuanke wrote:
> I'm not sure it is legal to pass i129. It seems front-end would pass i129 by value. However it is not related to this patch.
>
>
> ```
> [clang]$ cat t.c
> _BitInt(129) foo(_BitInt(129) a) {
> return a++;
> }
> [clang]$
> [clang]$ clang -S t.c -emit-llvm -O2
> [clang]$ cat t.ll
> ; ModuleID = 't.c'
> source_filename = "t.c"
> target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
> target triple = "x86_64-unknown-linux-gnu"
>
> ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn uwtable
> define dso_local void @foo(i129* noalias nocapture writeonly sret(i129) align 8 %agg.result, i129* nocapture noundef readonly byval(i129) align 8 %0) local_unnamed_addr #0 {
> entry:
> %a = load i129, i129* %0, align 8, !tbaa !3
> store i129 %a, i129* %agg.result, align 8, !tbaa !3
> ret void
> }
>
> ```
I think we'd better to avoid passing / returning `i129` type in tests, especially the returning.
https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/X86/X86CallingConv.td#L221-L222
The comments said returning more than two registers is out of the ABI scope. What's more, unlike the passing arguments, returning just has 3 usable registers and cannot use stack. So it will always crash if we want to return a type larger than `i192`.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D120329/new/
https://reviews.llvm.org/D120329
More information about the llvm-commits
mailing list