Skip to content

Commit 99fb725

Browse files
committed
Starting filechecking arithmetic instructions
1 parent 9df9b66 commit 99fb725

File tree

2 files changed

+75
-8
lines changed

2 files changed

+75
-8
lines changed

Sources/LLVM/IRBuilder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ public class IRBuilder {
501501
case .noSignedWrap:
502502
return LLVMBuildNSWSub(llvm, lhsVal, rhsVal, name)
503503
case .noUnsignedWrap:
504-
return LLVMBuildNSWSub(llvm, lhsVal, rhsVal, name)
504+
return LLVMBuildNUWSub(llvm, lhsVal, rhsVal, name)
505505
case .default:
506506
return LLVMBuildSub(llvm, lhsVal, rhsVal, name)
507507
}

Tests/LLVMTests/IRBuilderSpec.swift

Lines changed: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,88 @@ import Foundation
44

55
class IRBuilderSpec : XCTestCase {
66
func testIRBuilder() {
7-
XCTAssert(fileCheckOutput(of: .stderr) {
8-
// CHECK: ; ModuleID = 'IRBuilderTest'
9-
// CHECK-NEXT: source_filename = "IRBuilderTest"
7+
XCTAssert(fileCheckOutput(of: .stderr, withPrefixes: ["IRBUILDER"]) {
8+
// IRBUILDER: ; ModuleID = 'IRBuilderTest'
9+
// IRBUILDER-NEXT: source_filename = "IRBuilderTest"
1010
let module = Module(name: "IRBuilderTest")
1111
let builder = IRBuilder(module: module)
12-
// CHECK: define void @main() {
12+
// IRBUILDER: define void @main() {
1313
let main = builder.addFunction("main",
1414
type: FunctionType(argTypes: [],
1515
returnType: VoidType()))
16-
// CHECK-NEXT: entry:
16+
// IRBUILDER-NEXT: entry:
1717
let entry = main.appendBasicBlock(named: "entry")
1818
builder.positionAtEnd(of: entry)
19-
// CHECK-NEXT: ret void
19+
// IRBUILDER-NEXT: ret void
2020
builder.buildRetVoid()
21-
// CHECK-NEXT: }
21+
// IRBUILDER-NEXT: }
22+
module.dump()
23+
})
24+
25+
// MARK: Arithmetic Instructions
26+
27+
XCTAssert(fileCheckOutput(of: .stderr, withPrefixes: ["IRBUILDERARITH"]) {
28+
// IRBUILDERARITH: ; ModuleID = 'IRBuilderTest'
29+
// IRBUILDERARITH-NEXT: source_filename = "IRBuilderTest"
30+
let module = Module(name: "IRBuilderTest")
31+
let builder = IRBuilder(module: module)
32+
33+
// IRBUILDERARITH: @a = global i32 1
34+
// IRBUILDERARITH-NEXT: @b = global i32 1
35+
var g1 = builder.addGlobal("a", type: IntType.int32)
36+
g1.initializer = Int32(1)
37+
var g2 = builder.addGlobal("b", type: IntType.int32)
38+
g2.initializer = Int32(1)
39+
40+
// IRBUILDERARITH: define void @main() {
41+
let main = builder.addFunction("main",
42+
type: FunctionType(argTypes: [],
43+
returnType: VoidType()))
44+
// IRBUILDERARITH-NEXT: entry:
45+
let entry = main.appendBasicBlock(named: "entry")
46+
builder.positionAtEnd(of: entry)
47+
48+
// IRBUILDERARITH-NEXT: %0 = load i32, i32* @a
49+
let vg1 = builder.buildLoad(g1)
50+
// IRBUILDERARITH-NEXT: %1 = load i32, i32* @b
51+
let vg2 = builder.buildLoad(g2)
52+
53+
// IRBUILDERARITH-NEXT: %2 = add i32 %0, %1
54+
_ = builder.buildAdd(vg1, vg2)
55+
// IRBUILDERARITH-NEXT: %3 = sub i32 %0, %1
56+
_ = builder.buildSub(vg1, vg2)
57+
// IRBUILDERARITH-NEXT: %4 = mul i32 %0, %1
58+
_ = builder.buildMul(vg1, vg2)
59+
// IRBUILDERARITH-NEXT: %5 = sdiv i32 %0, %1
60+
_ = builder.buildDiv(vg1, vg2, signed: true)
61+
// IRBUILDERARITH-NEXT: %6 = udiv i32 %0, %1
62+
_ = builder.buildDiv(vg1, vg2, signed: false)
63+
64+
// IRBUILDERARITH-NEXT: %7 = add nsw i32 %0, %1
65+
_ = builder.buildAdd(vg1, vg2, overflowBehavior: .noSignedWrap)
66+
// IRBUILDERARITH-NEXT: %8 = sub nsw i32 %0, %1
67+
_ = builder.buildSub(vg1, vg2, overflowBehavior: .noSignedWrap)
68+
// IRBUILDERARITH-NEXT: %9 = mul nsw i32 %0, %1
69+
_ = builder.buildMul(vg1, vg2, overflowBehavior: .noSignedWrap)
70+
71+
// IRBUILDERARITH-NEXT: %10 = add nuw i32 %0, %1
72+
_ = builder.buildAdd(vg1, vg2, overflowBehavior: .noUnsignedWrap)
73+
// IRBUILDERARITH-NEXT: %11 = sub nuw i32 %0, %1
74+
_ = builder.buildSub(vg1, vg2, overflowBehavior: .noUnsignedWrap)
75+
// IRBUILDERARITH-NEXT: %12 = mul nuw i32 %0, %1
76+
_ = builder.buildMul(vg1, vg2, overflowBehavior: .noUnsignedWrap)
77+
78+
// IRBUILDERARITH-NEXT: %13 = sub i32 0, %0
79+
_ = builder.buildNeg(vg1, overflowBehavior: .default)
80+
// IRBUILDERARITH-NEXT: %14 = sub nuw i32 0, %0
81+
_ = builder.buildNeg(vg1, overflowBehavior: .noUnsignedWrap)
82+
// IRBUILDERARITH-NEXT: %15 = sub nsw i32 0, %0
83+
_ = builder.buildNeg(vg1, overflowBehavior: .noSignedWrap)
84+
85+
86+
// IRBUILDER-NEXT: ret void
87+
builder.buildRetVoid()
88+
// IRBUILDER-NEXT: }
2289
module.dump()
2390
})
2491
}

0 commit comments

Comments
 (0)