@@ -4,21 +4,142 @@ import Foundation
44
55class 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