@@ -4,21 +4,88 @@ import Foundation
4
4
5
5
class IRBuilderSpec : XCTestCase {
6
6
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"
10
10
let module = Module ( name: " IRBuilderTest " )
11
11
let builder = IRBuilder ( module: module)
12
- // CHECK : define void @main() {
12
+ // IRBUILDER : define void @main() {
13
13
let main = builder. addFunction ( " main " ,
14
14
type: FunctionType ( argTypes: [ ] ,
15
15
returnType: VoidType ( ) ) )
16
- // CHECK -NEXT: entry:
16
+ // IRBUILDER -NEXT: entry:
17
17
let entry = main. appendBasicBlock ( named: " entry " )
18
18
builder. positionAtEnd ( of: entry)
19
- // CHECK -NEXT: ret void
19
+ // IRBUILDER -NEXT: ret void
20
20
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: }
22
89
module. dump ( )
23
90
} )
24
91
}
0 commit comments