[llvm-dev] SDNode type UNDEF in new llvm-backend

Mehdi Amini via llvm-dev llvm-dev at lists.llvm.org
Mon May 16 22:36:48 PDT 2016


> On May 16, 2016, at 12:56 PM, Markus Weinhardt via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> Hello!
> 
> I'm new to llvm and have the following problem trying to implement a new
> backend, based on the LEG-backend by Fraser Cormack.
> 
> I used the standard clang command (under Ubuntu) to generate main.bc
> from the following tiny program:
> 
> main.c:
> void main() {
>  volatile int a, b, c;
>  c = a - b;
> }
> 
> I then used the following command:
> llc -march=lacore -debug -print-after-all main.bc -o main.s
> 
> The program terminated with an assertion violation, see output below.
> The UNDEF node (t3) apparently causes the problem. But, according to my
> understanding, this node is already generated in the IR->DAG translation
> and already exisiting in the initial selection DAG (in the load and
> store commands).

You program is loading from unallocated memory, this is what the "undef" represents here.


> Therefore, it is probably not related to my own,
> error-prone target implementation.

You target does not handle undef apparently.

-- 
Mehdi



> That makes the problem even harder to
> understand. I could not find out where the UNDEF SDNode is generated.
> 
> Thank you in advance for any hints!
> 
> Best regards,
> Markus
> 
> ---------------------------------------------------------------------
> ...
> 
> *** IR Dump After Module Verifier ***
> ; Function Attrs: nounwind uwtable
> define void @main() #0 {
>  %a = alloca i32, align 4
>  %b = alloca i32, align 4
>  %c = alloca i32, align 4
>  %1 = load volatile i32, i32* %a, align 4
>  %2 = load volatile i32, i32* %b, align 4
>  %3 = sub nsw i32 %1, %2
>  store volatile i32 %3, i32* %c, align 4
>  ret void
> }
> ---- Branch Probability Info : main ----
> 
> Computing probabilities for
> 
> === main
> Initial selection DAG: BB#0 'main:'
> SelectionDAG has 11 nodes:
>  t2: i32 = Constant<0>
>    t0: ch = EntryToken
>  t4: i32,ch = load<Volatile LD4[%a]> t0, FrameIndex:i32<0>, undef:i32
>  t6: i32,ch = load<Volatile LD4[%b]> t4:1, FrameIndex:i32<1>, undef:i32
>      t7: i32 = sub t4, t6
>    t9: ch = store<Volatile ST4[%c]> t6:1, t7, FrameIndex:i32<2>, undef:i32
>  t10: ch = RetFlag t9
> 
> ...
> 
> *** Final schedule ***
> SU(2): t3: i32 = undef
> 
> SU(4): t4: i32,ch = load<Volatile LD4[%a]> t0, FrameIndex:i32<0>, undef:i32
> 
> SU(5): t6: i32,ch = load<Volatile LD4[%b]> t4:1, FrameIndex:i32<1>,
> undef:i32
> 
> SU(3): t7: i32 = sub t4, t6
> 
> SU(1): t9: ch = store<Volatile ST4[%c]> t6:1, t7, FrameIndex:i32<2>,
> undef:i32
> 
> SU(0): t10: ch = RetFlag t9
> 
> 
> t3: i32 = undef
> This target-independent node should have been selected!
> UNREACHABLE executed at
> /home/markus/llvm_inst/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp:889!
> 
> 
> 
> -- 
> Prof. Dr.-Ing. Markus Weinhardt -  Hochschule Osnabrück
> Visiting Researcher at www.inesc-id.pt -ESDA, Lisbon/PT
> mweinhardt at computer.org  -  Tel.nr. +49-(0)541-969 3445
> Postf. 1940, 49009 Osnabrück (Artilleriestr. 46, SB223)
> http://www.ecs.hs-osnabrueck.de/weinhardt.html
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list