4
4
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
5
5
target triple = "i686-pc-windows-msvc18.0.0"
6
6
7
- %struct.S = type { i8* }
7
+ %struct.S = type { ptr , ptr }
8
8
9
- declare void @f (<{ %struct.S }>* inalloca (<{ %struct.S }>))
9
+ declare void @f (ptr inalloca (<{ %struct.S }>))
10
10
11
11
12
12
; Check that we don't clone the %x alloca and insert it in the live range of
@@ -15,45 +15,43 @@ define void @test(i1 %b) {
15
15
; CHECK-LABEL: @test(
16
16
; CHECK-NEXT: entry:
17
17
; CHECK-NEXT: [[X:%.*]] = alloca i8, align 1
18
- ; CHECK-NEXT: [[INALLOCA_SAVE:%.*]] = call i8* @llvm.stacksave()
18
+ ; CHECK-NEXT: [[INALLOCA_SAVE:%.*]] = call ptr @llvm.stacksave()
19
19
; CHECK-NEXT: [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_S:%.*]] }>, align 4
20
- ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <{ [[STRUCT_S]] }>, <{ [[STRUCT_S]] }>* [[ARGMEM]], i32 0, i32 0
21
- ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[TMP0]], i32 0, i32 0
22
- ; CHECK-NEXT: store i8* [[X]], i8** [[TMP1]], align 4
20
+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARGMEM]], i32 0, i32 1
21
+ ; CHECK-NEXT: store ptr [[X]], ptr [[TMP1]], align 4
23
22
; CHECK-NEXT: br i1 [[B:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
24
23
; CHECK: true:
25
- ; CHECK-NEXT: [[P:%.*]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[TMP0 ]], i32 0, i32 0
24
+ ; CHECK-NEXT: [[P:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARGMEM ]], i32 0, i32 1
26
25
; CHECK-NEXT: br label [[EXIT:%.*]]
27
26
; CHECK: false:
28
- ; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[TMP0 ]], i32 0, i32 0
27
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARGMEM ]], i32 0, i32 1
29
28
; CHECK-NEXT: br label [[EXIT]]
30
29
; CHECK: exit:
31
- ; CHECK-NEXT: call void @f(<{ [[STRUCT_S]] }>* inalloca(<{ [[STRUCT_S]] }>) [[ARGMEM]])
32
- ; CHECK-NEXT: call void @llvm.stackrestore(i8* [[INALLOCA_SAVE]])
30
+ ; CHECK-NEXT: call void @f(ptr inalloca(<{ [[STRUCT_S]] }>) [[ARGMEM]])
31
+ ; CHECK-NEXT: call void @llvm.stackrestore(ptr [[INALLOCA_SAVE]])
33
32
; CHECK-NEXT: ret void
34
33
;
35
34
entry:
36
35
%x = alloca i8
37
- %inalloca.save = call i8* @llvm.stacksave ()
36
+ %inalloca.save = call ptr @llvm.stacksave ()
38
37
%argmem = alloca inalloca <{ %struct.S }>, align 4
39
- %0 = getelementptr inbounds <{ %struct.S }>, <{ %struct.S }>* %argmem , i32 0 , i32 0
40
38
br i1 %b , label %true , label %false
41
39
42
40
true:
43
- %p = getelementptr inbounds %struct.S , %struct.S* %0 , i32 0 , i32 0
44
- store i8* %x , i8** %p , align 4
41
+ %p = getelementptr inbounds %struct.S , ptr %argmem , i32 0 , i32 1
42
+ store ptr %x , ptr %p , align 4
45
43
br label %exit
46
44
47
45
false:
48
- %p2 = getelementptr inbounds %struct.S , %struct.S* %0 , i32 0 , i32 0
49
- store i8* %x , i8** %p2 , align 4
46
+ %p2 = getelementptr inbounds %struct.S , ptr %argmem , i32 0 , i32 1
47
+ store ptr %x , ptr %p2 , align 4
50
48
br label %exit
51
49
52
50
exit:
53
- call void @f (<{ %struct.S }>* inalloca (<{ %struct.S }>) %argmem )
54
- call void @llvm.stackrestore (i8* %inalloca.save )
51
+ call void @f (ptr inalloca (<{ %struct.S }>) %argmem )
52
+ call void @llvm.stackrestore (ptr %inalloca.save )
55
53
ret void
56
54
}
57
55
58
- declare i8* @llvm.stacksave ()
59
- declare void @llvm.stackrestore (i8* )
56
+ declare ptr @llvm.stacksave ()
57
+ declare void @llvm.stackrestore (ptr )
0 commit comments