RFR: two small patches to fix AArch64

Doug Simon doug.simon at oracle.com
Wed Apr 12 12:07:51 UTC 2017


Hi Andrew,

> On 12 Apr 2017, at 13:13, Andrew Dinn <adinn at redhat.com> wrote:
> 
> I have been testing my fix for address lowering on AArch64 Graal by
> running netbeans and found several errors which crash the JVM. It seems
> the AArch64 port of Graal is already bust without my changes when it
> comes to running a large program like this.
> 
> I am still investigating some remaining problems but I wanted to propose
> these two small fixes in the backend code generation for inclusion
> before I propose my full patch.
> 
> Since these are tiny changes I am simply posting a git diff. Can someone
> in the project team apply them and push them to the main repo? Or do I
> have to provide a git PR?

Please provide a github PR. Since you've already submitted one PR, I hope the process is not too onerous and you are getting familiar with it. Feel free to ask for help!

-Doug

> 
> regards,
> 
> 
> Andrew Dinn
> -----------
> 
> Problem 1) Scaled displacement Address verify rule is incorrect
> 
> This first problem is innocuous until it gets uncovered by my changes
> but only because no hand-coded scaled displacement instructions happen
> to have used a large enough offset. Scaled offsets need to allow up to
> 12 unsigned bits.
> 
> --- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< -----
> git diff
> graal/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Address.java
> diff --git
> a/graal/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Address.java
> b/graal/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Address.java
> index 8a48c42..b86b2c4 100644
> ---
> a/graal/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Address.java
> +++
> b/graal/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Address.java
> @@ -286,7 +286,7 @@ public final class AArch64Address extends
> AbstractAddress {
>                 return immediate & NumUtil.getNbitNumberInt(9);
>             case IMMEDIATE_SCALED:
>                 // Unsigned value can be returned as-is.
> -                assert NumUtil.isUnsignedNbit(9, immediate);
> +                assert NumUtil.isUnsignedNbit(12, immediate);
>                 return immediate;
>             case PC_LITERAL:
>                 // 21-bit signed value, but lower 2 bits are always 0
> and are shifted out.
> --- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< -----
> 
> Problem 1) Stack-bang shadow region size is waaay over-size
> 
> The second patch fixes a problem in the stack-banging code generation.
> 
> On AArch64 page size is normally 64K. The current code to compute the
> stack bang offset ends up using an offset of 20 * 64K (25 * 64K in dev
> builds) which is obviously ludicrous. It causes almost immediate stack
> overflows on any reasonably large program. The following generic change
> assumes a 4K shadow page unit then rounds up to the resulting stack bang
> offset to a multiple of the actual page size.
> 
> n.b. this change merely updates Graal to relect what happens in the
> latest jdk9/hotspot generic source (see os::init_before_ergo in
> hotspot/src/share/vm/runtime/os.cpp).
> 
> --- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< -----
> diff --git
> a/graal/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotHostBackend.java
> b/graal/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotHostBackend.java
> index f58232f..7af446d 100644
> ---
> a/graal/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotHostBackend.java
> +++
> b/graal/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotHostBackend.java
> @@ -22,9 +22,11 @@
>  */
> package org.graalvm.compiler.hotspot;
> 
> +import static jdk.vm.ci.code.CodeUtil.K;
> import static jdk.vm.ci.code.CodeUtil.getCallingConvention;
> import static jdk.vm.ci.common.InitTimer.timer;
> 
> +import org.graalvm.compiler.core.common.NumUtil;
> import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
> import org.graalvm.compiler.hotspot.meta.HotSpotHostForeignCallsProvider;
> import org.graalvm.compiler.hotspot.meta.HotSpotLoweringProvider;
> @@ -109,7 +111,7 @@ public abstract class HotSpotHostBackend extends
> HotSpotBackend {
>             // is greater than a page.
> 
>             int pageSize = config.vmPageSize;
> -            int bangEnd = config.stackShadowPages * pageSize;
> +            int bangEnd = NumUtil.roundUp(config.stackShadowPages * 4 *
> K, pageSize);
> 
>             // This is how far the previous frame's stack banging extended.
>             int bangEndSafe = bangEnd;
> --- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< -----



More information about the graal-dev mailing list