Swift to IR, generates wrong IR

Hi,
I have a simple swift code from which I generate IR code with ‘swiftc test.swift -emit-ir -o test.ll'
When I try to run the .ll file or apply optimization with opt, I get errors like this one:

lli: test.ll:548:110: error: expected instruction opcode
  %9 = cmpxchg i64* bitcast (%swift.type*** @field_type_vector_TipCalculator to i64*), i64 0, i64 %8 seq_cst seq_cst
                                                                                                                                                                             ^
I know swift is not part of the LLVM oss project, but is this problem coming from swift generating wrong IR code or is this a LLVM bug (or maybe I’m just doing something wrong)?

Cheers,

ps: this is the swift code I try running:

class TipCalculator {

  // 2
  let total: Double
    let taxPct: Double
    let subtotal: Double

    // 3
    init(total: Double, taxPct: Double) {a
      self.total = total
        self.taxPct = taxPct
        subtotal = total / (taxPct + 1)
    }

  // 4
  func calcTipWithTipPct(tipPct: Double) -> Double {a
    return subtotal * tipPct
  }

  // 5
  func printPossibleTips() {
    print("15%: \(calcTipWithTipPct(0.15))")
      print("18%: \(calcTipWithTipPct(0.18))")
      print("20%: \(calcTipWithTipPct(0.20))")
  }

}

// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()

Sorry, the error is (the previous one was from Apple’s lli):

Documents/strong.codes/code/build/obfuscator-llvm/bin/opt: test.ll:57:203: error: expected comma after getelementptr's type
@_METACLASS_DATA__TtC4test13TipCalculator = private constant { i32, i32, i32, i32, i8*, i8*, i8*, i8*, i8*, i8*, i8* } { i32 129, i32 40, i32 40, i32 0, i8* null, i8* getelementptr inbounds ([25 x i8]* @7, i64 0, i64 0), i8* null, i8* null, i8* null, i8* null, i8* null }, section "__DATA, __objc_const", align 8
                                                        ^

Hi,

Sorry, the error is (the previous one was from Apple’s lli):

Documents/strong.codes/code/build/obfuscator-llvm/bin/opt: test.ll:57:203: error: expected comma after getelementptr's type
@_METACLASS_DATA__TtC4test13TipCalculator = private constant { i32, i32, i32, i32, i8*, i8*, i8*, i8*, i8*, i8*, i8* } { i32 129, i32 40, i32 40, i32 0, i8* null, i8* getelementptr inbounds ([25 x i8]* @7, i64 0, i64 0), i8* null, i8* null, i8* null, i8* null, i8* null }, section "__DATA, __objc_const", align 8

The IR format is not stable and it seems like Swift is using an LLVM <
3.7, while your opt executable is from LLVM 3.7. The `getelementptr`
instruction (besides others) now expects the pointer type to be given
explicitly. I don't know Swift, but if you can get it to emit bitcode
instead of IR, that should work AFAIK. Looking at the command line,
you probably need -emit-bc.

Björn

Thx a lot, worked with '-emit-bc’

Cheers,

Be careful if this is intended for production use, there's nothing
forbidding Swift from making use of LLVM extensions (IR or backend)
that don't exist in OSS (yet). The only compiler that can definitely
consume IR produced by swiftc is swiftc.

Cheers.

Tim.