Skip to content

Commit 634fc76

Browse files
CodaFiharlanhaskins
authored andcommitted
Starting filechecking arithmetic instructions (#42)
* Starting filechecking arithmetic instructions * Add integer comparison tests
1 parent 635366c commit 634fc76

File tree

2 files changed

+129
-8
lines changed

2 files changed

+129
-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: 128 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,142 @@ 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+
// IRBUILDERARITH-NEXT: ret void
87+
builder.buildRetVoid()
88+
// IRBUILDERARITH-NEXT: }
89+
module.dump()
90+
})
91+
92+
// MARK: Integer comparisons
93+
XCTAssert(fileCheckOutput(of: .stderr, withPrefixes: ["IRBUILDERCMP"]) {
94+
// IRBUILDERCMP: ; ModuleID = 'IRBuilderTest'
95+
// IRBUILDERCMP-NEXT: source_filename = "IRBuilderTest"
96+
let module = Module(name: "IRBuilderTest")
97+
let builder = IRBuilder(module: module)
98+
99+
// IRBUILDERCMP: @a = global i32 1
100+
// IRBUILDERCMP-NEXT: @b = global i32 1
101+
var g1 = builder.addGlobal("a", type: IntType.int32)
102+
g1.initializer = Int32(1)
103+
var g2 = builder.addGlobal("b", type: IntType.int32)
104+
g2.initializer = Int32(1)
105+
106+
// IRBUILDERCMP: define void @main() {
107+
let main = builder.addFunction("main",
108+
type: FunctionType(argTypes: [],
109+
returnType: VoidType()))
110+
// IRBUILDERCMP-NEXT: entry:
111+
let entry = main.appendBasicBlock(named: "entry")
112+
builder.positionAtEnd(of: entry)
113+
114+
// IRBUILDERCMP-NEXT: %0 = load i32, i32* @a
115+
let vg1 = builder.buildLoad(g1)
116+
// IRBUILDERCMP-NEXT: %1 = load i32, i32* @b
117+
let vg2 = builder.buildLoad(g2)
118+
119+
// IRBUILDERCMP-NEXT: %2 = icmp eq i32 %0, %1
120+
_ = builder.buildICmp(vg1, vg2, .eq)
121+
// IRBUILDERCMP-NEXT: %3 = icmp ne i32 %0, %1
122+
_ = builder.buildICmp(vg1, vg2, .ne)
123+
// IRBUILDERCMP-NEXT: %4 = icmp ugt i32 %0, %1
124+
_ = builder.buildICmp(vg1, vg2, .ugt)
125+
// IRBUILDERCMP-NEXT: %5 = icmp uge i32 %0, %1
126+
_ = builder.buildICmp(vg1, vg2, .uge)
127+
// IRBUILDERCMP-NEXT: %6 = icmp ult i32 %0, %1
128+
_ = builder.buildICmp(vg1, vg2, .ult)
129+
// IRBUILDERCMP-NEXT: %7 = icmp ule i32 %0, %1
130+
_ = builder.buildICmp(vg1, vg2, .ule)
131+
// IRBUILDERCMP-NEXT: %8 = icmp sgt i32 %0, %1
132+
_ = builder.buildICmp(vg1, vg2, .sgt)
133+
// IRBUILDERCMP-NEXT: %9 = icmp sge i32 %0, %1
134+
_ = builder.buildICmp(vg1, vg2, .sge)
135+
// IRBUILDERCMP-NEXT: %10 = icmp slt i32 %0, %1
136+
_ = builder.buildICmp(vg1, vg2, .slt)
137+
// IRBUILDERCMP-NEXT: %11 = icmp sle i32 %0, %1
138+
_ = builder.buildICmp(vg1, vg2, .sle)
139+
140+
// IRBUILDERCMP-NEXT: ret void
141+
builder.buildRetVoid()
142+
// IRBUILDERCMP-NEXT: }
22143
module.dump()
23144
})
24145
}

0 commit comments

Comments
 (0)