[LLVMdev] ARM opcode format

James Molloy James.Molloy at arm.com
Mon Feb 20 05:11:07 PST 2012


Guillermo,

Didn’t ICS ship with 2.9? You’d need to reproduce with trunk for this to be a valid bug report because it may be fixed already.

Cheers,

James

From: Guillermo Perez [mailto:gaperez64 at gmail.com]
Sent: 20 February 2012 12:59
To: James Molloy; llvmdev at cs.uiuc.edu
Subject: Re: [LLVMdev] ARM opcode format

Hi,

I'm sorry I forgot to mention I am compiling the bitcode using the JIT. The actual error, I get when I'm trying to get the function to the pointer. I'm using a custom front end that translates Android's Dalvik bytecode into LLVM bitcode based on Android ICS's modified LLVM version.

Thanks,
On Mon, Feb 20, 2012 at 7:55 PM, James Molloy <James.Molloy at arm.com<mailto:James.Molloy at arm.com>> wrote:
Hi Guillermo,

I’m unable to reproduce the error you’re seeing with your bitcode input. “llc –mtriple armv7a-unknown-linux-gnueabi –O3” succeeds.

What are you using to reproduce, and what version?

Cheers,

James

From: Guillermo Perez [mailto:gaperez64 at gmail.com<mailto:gaperez64 at gmail.com>]
Sent: 20 February 2012 11:32
To: James Molloy; llvmdev at cs.uiuc.edu<mailto:llvmdev at cs.uiuc.edu>
Subject: Re: [LLVMdev] ARM opcode format

Hi,

I haven't been able to reproduce this problem on a smaller test and the original source code is from another virtual machine's IR. What I found out was that 42 << 7 is actually DPSoRegImmFrm, defined in ARMInstrFormats.td. This format is not dealt with in the ARMCodeEmitter.cpp and that's the problem I'm facing.

The triple I'm using is "armv7-unknown-linux-gnueabi" and the bitcode I'm dealing with is:

 ; ModuleID = 'CRYO jit'
 target triple = "armv7a-unknown-linux-gnueabi"
 define i32 @execute(i8* %JNIEnv, i8* %v8) {
 entry:
   %litTemp = alloca i32
   %v0_INTEGER = alloca i32
   %v4_INTEGER = alloca i32
   %v5_INTEGER = alloca i32
   %v2_INTEGER = alloca i32
   %v6_INTEGER = alloca i32
   %v5_POINTER = alloca i8*
   %v1_INTEGER = alloca i32
   %v3_INTEGER = alloca i32
   %v7_INTEGER = alloca i32
   store i32 1, i32* %v7_INTEGER
   store i32 1, i32* %v3_INTEGER
   store i32 0, i32* %v1_INTEGER
   %0 = getelementptr i8* %v8, i32 8
   %1 = bitcast i8* %0 to i8**
   %2 = load i8** %1
   store i8* %2, i8** %v5_POINTER
   store i32 0, i32* %v6_INTEGER
   %3 = load i8** %v5_POINTER
   %4 = getelementptr i8* %3, i32 12
   %5 = bitcast i8* %4 to i32*
   %6 = load i32* %v6_INTEGER
   %7 = getelementptr i32* %5, i32 %6
   %8 = load i32* %v7_INTEGER
   store i32 %8, i32* %7
   %9 = getelementptr i8* %v8, i32 8
   %10 = bitcast i8* %9 to i8**
   %11 = load i8** %10
   store i8* %11, i8** %v5_POINTER
   store i32 2, i32* %v6_INTEGER
   %12 = load i8** %v5_POINTER
   %13 = getelementptr i8* %12, i32 12
   %14 = bitcast i8* %13 to i32*
   %15 = load i32* %v7_INTEGER
   %16 = getelementptr i32* %14, i32 %15
   %17 = load i32* %v6_INTEGER
   store i32 %17, i32* %16
   store i32 2, i32* %v3_INTEGER
   store i32 3, i32* %v2_INTEGER
   br label %label000f
 label000f:                                        ; preds = %merge0024, %entry
   %18 = getelementptr i8* %v8, i32 12
   %19 = bitcast i8* %18 to i32*
   %20 = load i32* %19
   store i32 %20, i32* %v5_INTEGER
   %21 = load i32* %v2_INTEGER
   %22 = load i32* %v5_INTEGER
   %23 = icmp slt i32 %21, %22
   br i1 %23, label %merge0014, label %else
 else:                                             ; preds = %label000f
   %24 = load i32* %v3_INTEGER
   ret i32 %24
 merge0014:                                        ; preds = %label000f
   store i32 1, i32* %v4_INTEGER
   store i32 1, i32* %v0_INTEGER
   br label %label0016
 label0016:                                        ; preds = %merge003e, %merge0014
   %25 = load i32* %v4_INTEGER
   %26 = load i32* %v3_INTEGER
   %27 = icmp sge i32 %25, %26
   br i1 %27, label %merge001a, label %else1
 else1:                                            ; preds = %label0016
   %28 = load i32* %v0_INTEGER
   %29 = icmp ne i32 %28, 0
   br i1 %29, label %merge0027, label %else2
 else2:                                            ; preds = %else1
   br label %merge001a
 merge001a:                                        ; preds = %else2, %label0016
   %30 = load i32* %v0_INTEGER
   %31 = icmp eq i32 %30, 0
   br i1 %31, label %merge0024, label %else3
 else3:                                            ; preds = %merge001a
   %32 = load i32* %v3_INTEGER
   store i32 1, i32* %litTemp
   %33 = load i32* %litTemp
   %34 = add i32 %32, %33
   store i32 %34, i32* %v3_INTEGER
   %35 = getelementptr i8* %v8, i32 8
   %36 = bitcast i8* %35 to i8**
   %37 = load i8** %36
   store i8* %37, i8** %v5_POINTER
   %38 = load i32* %v3_INTEGER
   %39 = load i32* %v7_INTEGER
   %40 = sub i32 %38, %39
   store i32 %40, i32* %v6_INTEGER
   %41 = load i8** %v5_POINTER
   %42 = getelementptr i8* %41, i32 12
   %43 = bitcast i8* %42 to i32*
   %44 = load i32* %v6_INTEGER
   %45 = getelementptr i32* %43, i32 %44
   %46 = load i32* %v2_INTEGER
   store i32 %46, i32* %45
   br label %merge0024
 merge0024:                                        ; preds = %else3, %merge001a
   %47 = load i32* %v2_INTEGER
   store i32 1, i32* %litTemp
   %48 = load i32* %litTemp
   %49 = add i32 %47, %48
   store i32 %49, i32* %v2_INTEGER
   br label %label000f
 merge0027:                                        ; preds = %else1
   %50 = getelementptr i8* %v8, i32 8
   %51 = bitcast i8* %50 to i8**
   %52 = load i8** %51
   store i8* %52, i8** %v5_POINTER
   %53 = load i8** %v5_POINTER
   %54 = getelementptr i8* %53, i32 12
   %55 = bitcast i8* %54 to i32*
   %56 = load i32* %v4_INTEGER
   %57 = getelementptr i32* %55, i32 %56
   %58 = load i32* %57
   store i32 %58, i32* %v5_INTEGER
   %59 = load i32* %v5_INTEGER
   %60 = icmp sle i32 %59, 0
   br i1 %60, label %merge003e, label %else4
 else4:                                            ; preds = %merge0027
   %61 = getelementptr i8* %v8, i32 8
   %62 = bitcast i8* %61 to i8**
   %63 = load i8** %62
   store i8* %63, i8** %v5_POINTER
   %64 = load i8** %v5_POINTER
   %65 = getelementptr i8* %64, i32 12
   %66 = bitcast i8* %65 to i32*
   %67 = load i32* %v4_INTEGER
   %68 = getelementptr i32* %66, i32 %67
   %69 = load i32* %68
   store i32 %69, i32* %v5_INTEGER
   %70 = load i32* %v2_INTEGER
   store i32 2, i32* %litTemp
   %71 = load i32* %litTemp
   %72 = udiv i32 %70, %71
   store i32 %72, i32* %v6_INTEGER
   %73 = load i32* %v5_INTEGER
   %74 = load i32* %v6_INTEGER
   %75 = icmp sgt i32 %73, %74
   br i1 %75, label %merge003e, label %else5
 else5:                                            ; preds = %else4
   %76 = getelementptr i8* %v8, i32 8
   %77 = bitcast i8* %76 to i8**
   %78 = load i8** %77
   store i8* %78, i8** %v5_POINTER
   %79 = load i8** %v5_POINTER
   %80 = getelementptr i8* %79, i32 12
   %81 = bitcast i8* %80 to i32*
   %82 = load i32* %v4_INTEGER
   %83 = getelementptr i32* %81, i32 %82
   %84 = load i32* %83
   store i32 %84, i32* %v5_INTEGER
   %85 = load i32* %v2_INTEGER
   %86 = load i32* %v5_INTEGER
   %87 = urem i32 %85, %86
   store i32 %87, i32* %v5_INTEGER
   %88 = load i32* %v5_INTEGER
   %89 = icmp ne i32 %88, 0
   br i1 %89, label %merge003e, label %else6
 else6:                                            ; preds = %else5
   store i32 0, i32* %v0_INTEGER
   br label %merge003e
 merge003e:                                        ; preds = %else6, %else5, %else4, %merge0027
   %90 = load i32* %v4_INTEGER
   store i32 1, i32* %litTemp
   %91 = load i32* %litTemp
   %92 = add i32 %90, %91
   store i32 %92, i32* %v4_INTEGER
   br label %label0016
 }

Thanks for your help,

On Mon, Feb 20, 2012 at 7:10 PM, James Molloy <james.molloy at arm.com<mailto:james.molloy at arm.com>> wrote:
Hi Guillermo,

It’s difficult to do anything without a testcase – do you have a (reduced) testcase available?

Cheers,

James

From: llvmdev-bounces at cs.uiuc.edu<mailto:llvmdev-bounces at cs.uiuc.edu> [mailto:llvmdev-bounces at cs.uiuc.edu<mailto:llvmdev-bounces at cs.uiuc.edu>] On Behalf Of Guillermo Perez
Sent: 20 February 2012 07:48
To: llvmdev at cs.uiuc.edu<mailto:llvmdev at cs.uiuc.edu>
Subject: [LLVMdev] ARM opcode format

I'm doing some tests running llvm on Android. I'm getting an error message saying:

Unhandled instruction encoding format!

I checked which instruction was causing this and it is ADDrsi, it appears to have format 42 << 7, which is definitely not available in ARMBaseInfo.h

Any suggestions are welcome

--
Guillermo A. Pérez (吉耶莫)



--
Guillermo A. Pérez (吉耶莫)

-- IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.



--
Guillermo A. Pérez (吉耶莫)

-- IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120220/793503c5/attachment.html>


More information about the llvm-dev mailing list