Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Evaluator: Can't evaluate QIR file #121

Closed
chemix-lunacy opened this issue May 20, 2022 · 5 comments
Closed

Evaluator: Can't evaluate QIR file #121

chemix-lunacy opened this issue May 20, 2022 · 5 comments
Labels
bug Something isn't working documentation Improvements or additions to documentation

Comments

@chemix-lunacy
Copy link

Using NonadaptiveEvaluator.eval crashes the process when given a QIR .ll file and fails with an encoding exception when given a bitcode version of the same file. Nothing custom was done to generate the QIR (straight from the Q# compiler) or bitcode (just passed directly to llvm::WriteBitcodeToFile). The code itself is very basic - just one of the many Q# examples floating around. pyqir was also installed from pip, not a local version.

Bitcode issue is likely due to us using LLVM 13 which I believe is a different version than the one you're using, so may not be an issue per-say, but attaching it if you want to look at it further. There might be a way to strip version/encoding from the bitcode, but haven't spent too much time digging as-of yet.

Just mention if you need any additional info.

QIR and bitcode files.

Versions/System Info

py-evaluator: 0.4.0-alpha.1
OS: Windows 10 Pro, 21H1
Python: 3.8
Rust: 1.60
Q# SDK: 0.24.208024

@chemix-lunacy chemix-lunacy added the bug Something isn't working label May 20, 2022
@LaurentAjdnik
Copy link
Contributor

Hi @chemix-lunacy and thanks for your feedback!

Regarding the encoding error when evaluating the BasicExample.bc file:

Doing the test, I get the same LLVM ERROR: Invalid encoding problem as you do.

This is a very low-level fatal error thrown by the core LLVM itself.

Your file does not seem valid. Running llvm-bcanalyzer on it returns the same error with LLVM 11, 13 and even 14:

llvm-bcanalyzer: can't skip to bit 34931315776 from 864

Which llvm::WriteBitcodeToFile did you use?

When assembling from BasicExample.ll with llvm-as, the resulting bitcode can be analyzed properly with llvm-bcanalyzer.

And the encoding error disappears, yippee! 😄

Unfortunately, both bcand ll files still make pyqir-evaluator crash. 😢

I'll try to find some time to investigate further.

In particular, llvm-bcanalyzer itself is not able to parse a short piece of the file (details with --dump):

  <UnknownBlock26 NumWords=6 BlockCodeSize=2>
    <UnknownCode1 op0=115 op1=105 op2=110 op3=103 op4=108 op5=101 op6=116 op7=104 op8=114 op9=101 op10=97 op11=100/>
    <UnknownCode1/>
  </UnknownBlock26>
  Block ID #26:
      Num Instances: 1
         Total Size: 245b/30.62B/7W
    Percent of file: 0.2501%
      Num SubBlocks: 0
        Num Abbrevs: 0
        Num Records: 2
    Percent Abbrevs: 0.0000%

	Record Histogram:
		  Count    # Bits     b/Rec   % Abv  Record Kind
		      2       172      86.0          UnknownCode1

@chemix-lunacy
Copy link
Author

@LaurentAjdnik Thanks for looking into it!

I'm using the same method that llvm-as uses but obviously with some required arguments missing or slightly different. It's not super import I get it working though as I don't need the bitcode right now, I was simply seeing if it worked where basic QIR didn't.

@LaurentAjdnik
Copy link
Contributor

Hi again @chemix-lunacy! I think I got it!

I did many tries until I simplified your ll file to the extreme:

%String = type opaque

@0 = internal constant [3 x i8] c"()\00"

declare %String* @__quantum__rt__string_create(i8*)

define void @Microsoft__Quantum__OracleGenerator__RunProgram() #1 {
entry:
  %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @0, i32 0, i32 0))
  ret void
}

attributes #1 = { "EntryPoint" }

But it still failed...

On the other hand, replacing @__quantum__rt__string_create with any of the "well-known functions" (@__quantum__qis__h__body, @__quantum__qis__x__body...) works!

Looking into the code of the evaluator, it seems only a few functions are currently handled.

@__quantum__rt__string_create is simply unknown and cannot be evaluated. Hence the crash.

Well... It should rather return an error rather than crash... I'll file a separate issue...

@idavis
Copy link
Collaborator

idavis commented May 24, 2022

Thanks @LaurentAjdnik - We should update the readme and code docs saying what bitcode is supported. Right now the evaluator can JIT QIR produced by the pyqir-generator, but cannot use any external function calls. The pyqir-evaluator does not have a full runtime environment and thus does not have a definition for __quantum__rt__string_create. We should also make better error messages as noted in #122 . We have another PR that is adding multiple LLVM version support (if manually building) and will be changing the default version to 13 after that PR is merged.

@idavis idavis added the documentation Improvements or additions to documentation label May 24, 2022
@idavis
Copy link
Collaborator

idavis commented May 26, 2022

@chemix-lunacy I'm going to close this issue for now and use #122 to track a fix.

@idavis idavis closed this as completed May 26, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

3 participants