@@ -4,21 +4,142 @@ 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
+ // 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: }
22
143
module. dump ( )
23
144
} )
24
145
}
0 commit comments