[llvm] r311137 - GlobalISel (AArch64): fix ABI at border between GPRs and SP.

Diana Picus via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 18 02:36:37 PDT 2017


Hi Tim,

I reverted this since I think it broke the global isel bot:
http://lab.llvm.org:8011/builders/clang-cmake-aarch64-global-isel/builds/471

I haven't reproduced it yet because I'm a pest, but everything else in
that range looks pretty innocent (r311135 was reverted in the next
build and that didn't fix the bot).
Let me know if you want me to extract some MIR from one of the broken tests.

Cheers,
Diana

On 18 August 2017 at 01:14, Tim Northover via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: tnorthover
> Date: Thu Aug 17 16:14:01 2017
> New Revision: 311137
>
> URL: http://llvm.org/viewvc/llvm-project?rev=311137&view=rev
> Log:
> GlobalISel (AArch64): fix ABI at border between GPRs and SP.
>
> If a struct would end up half in GPRs and half on SP the ABI says it should
> actually go entirely on the stack. We were getting this wrong in GlobalISel
> before, causing compatibility issues.
>
> Modified:
>     llvm/trunk/lib/Target/AArch64/AArch64CallLowering.cpp
>     llvm/trunk/test/CodeGen/AArch64/GlobalISel/call-translator.ll
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64CallLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64CallLowering.cpp?rev=311137&r1=311136&r2=311137&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64CallLowering.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64CallLowering.cpp Thu Aug 17 16:14:01 2017
> @@ -188,12 +188,16 @@ void AArch64CallLowering::splitToValueTy
>    }
>
>    unsigned FirstRegIdx = SplitArgs.size();
> +  bool AlreadySplit = false;
>    for (auto SplitVT : SplitVTs) {
> -    // FIXME: set split flags if they're actually used (e.g. i128 on AAPCS).
>      Type *SplitTy = SplitVT.getTypeForEVT(Ctx);
>      SplitArgs.push_back(
>          ArgInfo{MRI.createGenericVirtualRegister(getLLTForType(*SplitTy, DL)),
>                  SplitTy, OrigArg.Flags, OrigArg.IsFixed});
> +    if (!AlreadySplit) {
> +      SplitArgs.back().Flags.setSplit();
> +      AlreadySplit = true;
> +    }
>    }
>
>    for (unsigned i = 0; i < Offsets.size(); ++i)
>
> Modified: llvm/trunk/test/CodeGen/AArch64/GlobalISel/call-translator.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/call-translator.ll?rev=311137&r1=311136&r2=311137&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/call-translator.ll (original)
> +++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/call-translator.ll Thu Aug 17 16:14:01 2017
> @@ -215,3 +215,42 @@ define void @test_call_stack() {
>  define void @test_mem_i1([8 x i64], i1 %in) {
>    ret void
>  }
> +
> +; CHECK-LABEL: name: test_split_struct
> +; CHECK: [[STRUCT:%[0-9]+]](s128) = G_LOAD {{.*}}(p0)
> +; CHECK: [[LO:%[0-9]+]](s64) = G_EXTRACT [[STRUCT]](s128), 0
> +; CHECK: [[HI:%[0-9]+]](s64) = G_EXTRACT [[STRUCT]](s128), 64
> +
> +; CHECK: [[SP:%[0-9]+]](p0) = COPY %sp
> +; CHECK: [[OFF:%[0-9]+]](s64) = G_CONSTANT i64 0
> +; CHECK: [[ADDR:%[0-9]+]](p0) = G_GEP [[SP]], [[OFF]]
> +; CHECK: G_STORE [[LO]](s64), [[ADDR]](p0) :: (store 8 into stack, align 0)
> +
> +; CHECK: [[SP:%[0-9]+]](p0) = COPY %sp
> +; CHECK: [[OFF:%[0-9]+]](s64) = G_CONSTANT i64 8
> +; CHECK: [[ADDR:%[0-9]+]](p0) = G_GEP [[SP]], [[OFF]]
> +; CHECK: G_STORE [[HI]](s64), [[ADDR]](p0) :: (store 8 into stack + 8, align 0)
> +define void @test_split_struct([2 x i64]* %ptr) {
> +  %struct = load [2 x i64], [2 x i64]* %ptr
> +  call void @take_split_struct([2 x i64]* null, i64 1, i64 2, i64 3,
> +                               i64 4, i64 5, i64 6,
> +                               [2 x i64] %struct)
> +  ret void
> +}
> +
> +; CHECK-LABEL: name: take_split_struct
> +; CHECK: fixedStack:
> +; CHECK-DAG:   - { id: [[LO_FRAME:[0-9]+]], type: default, offset: 0, size: 8
> +; CHECK-DAG:   - { id: [[HI_FRAME:[0-9]+]], type: default, offset: 8, size: 8
> +
> +; CHECK: [[LOPTR:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[LO_FRAME]]
> +; CHECK: [[LO:%[0-9]+]](s64) = G_LOAD [[LOPTR]](p0) :: (invariant load 8 from %fixed-stack.[[LO_FRAME]], align 0)
> +
> +; CHECK: [[HIPTR:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[HI_FRAME]]
> +; CHECK: [[HI:%[0-9]+]](s64) = G_LOAD [[HIPTR]](p0) :: (invariant load 8 from %fixed-stack.[[HI_FRAME]], align 0)
> +define void @take_split_struct([2 x i64]* %ptr, i64, i64, i64,
> +                               i64, i64, i64,
> +                               [2 x i64] %in) {
> +  store [2 x i64] %in, [2 x i64]* %ptr
> +  ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list