[llvm] r284917 - [ARM] Fix crash in ConstantIslands

Friedman, Eli via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 24 10:20:00 PDT 2016


On 10/22/2016 2:58 AM, James Molloy via llvm-commits wrote:
> Author: jamesm
> Date: Sat Oct 22 04:58:37 2016
> New Revision: 284917
>
> URL: http://llvm.org/viewvc/llvm-project?rev=284917&view=rev
> Log:
> [ARM] Fix crash in ConstantIslands
>
> tPCRelJT may not be the first instruction in a block. Check that instead of dereferencing a broken iterator.

Thanks for the fix... but this exposes more problems.

It looks like the jump tables being generated by this optimization 
aren't properly aligned; with -no-integrated-as, I'm getting errors like 
"Error: invalid immediate for address calculation (value = 
0x00000006)".  I haven't reduced a testcase yet, but it's triggering on 
a bunch of SPEC tests, so it shouldn't be hard to reproduce.

-Eli


>
> Added:
>      llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll
> Modified:
>      llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp
>
> Modified: llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp?rev=284917&r1=284916&r2=284917&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp Sat Oct 22 04:58:37 2016
> @@ -2048,7 +2048,9 @@ bool ARMConstantIslands::optimizeThumb2J
>         //   %base = tLEApcrelJT
>         //   %t = tLDRr %idx, %base
>         unsigned BaseReg = User.MI->getOperand(0).getReg();
> -
> +
> +      if (User.MI->getIterator() == User.MI->getParent()->begin())
> +        continue;
>         MachineInstr *Shift = User.MI->getPrevNode();
>         if (Shift->getOpcode() != ARM::tLSLri ||
>             Shift->getOperand(3).getImm() != 2 ||
>
> Added: llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll?rev=284917&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll Sat Oct 22 04:58:37 2016
> @@ -0,0 +1,43 @@
> +; RUN: llc < %s
> +; No FileCheck - testing for crash.
> +
> +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
> +target triple = "thumbv5e-none-linux-gnueabi"
> +
> +%struct.blam = type { [4 x %struct.eggs], [6 x [15 x i16]], [6 x i32], i32, i32, i32, i32, i32, i32, %struct.eggs, [4 x %struct.eggs], [4 x %struct.eggs], [4 x i32], i32, i32, i32, [4 x %struct.eggs], [4 x %struct.eggs], i32, %struct.eggs, i32 }
> +%struct.eggs = type { i32, i32 }
> +
> +define void @spam(%struct.blam* %arg, i32 %arg1) {
> +bb:
> +  %tmp = getelementptr inbounds %struct.blam, %struct.blam* %arg, i32 undef, i32 2, i32 %arg1
> +  switch i32 %arg1, label %bb8 [
> +    i32 0, label %bb2
> +    i32 1, label %bb3
> +    i32 2, label %bb4
> +    i32 3, label %bb5
> +    i32 4, label %bb6
> +    i32 5, label %bb7
> +  ]
> +
> +bb2:                                              ; preds = %bb
> +  unreachable
> +
> +bb3:                                              ; preds = %bb
> +  unreachable
> +
> +bb4:                                              ; preds = %bb
> +  unreachable
> +
> +bb5:                                              ; preds = %bb
> +  unreachable
> +
> +bb6:                                              ; preds = %bb
> +  unreachable
> +
> +bb7:                                              ; preds = %bb
> +  unreachable
> +
> +bb8:                                              ; preds = %bb
> +  store i32 1, i32* %tmp, align 4
> +  unreachable
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project



More information about the llvm-commits mailing list