1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1
2
; RUN: opt < %s -sroa -S | FileCheck %s
2
3
; RUN: opt < %s -passes=sroa -S | FileCheck %s
3
4
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
@@ -14,17 +15,33 @@ target triple = "x86_64-unknown-linux-gnu"
14
15
define i64 @test_struct_of_int_char (i1 zeroext %test , i64 ()* %p ) {
15
16
; CHECK-LABEL: @test_struct_of_int_char(
16
17
; CHECK-NEXT: entry:
17
- ; COM: Check that registers are used and alloca instructions are eliminated.
18
- ; CHECK-NOT: alloca
18
+ ; CHECK-NEXT: br i1 [[TEST:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
19
19
; CHECK: if.then:
20
20
; CHECK-NEXT: br label [[RETURN:%.*]]
21
21
; CHECK: if.end:
22
- ; CHECK-NEXT: call i64 [[P:%.*]]()
23
- ; CHECK: br label [[RETURN]]
22
+ ; CHECK-NEXT: [[CALL:%.*]] = call i64 [[P:%.*]]()
23
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[CALL]] to i32
24
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_EXTRACT_SHIFT:%.*]] = lshr i64 [[CALL]], 32
25
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_3_0_EXTRACT_SHIFT]] to i8
26
+ ; CHECK-NEXT: [[RETVAL_SROA_4_0_EXTRACT_SHIFT:%.*]] = lshr i64 [[CALL]], 40
27
+ ; CHECK-NEXT: [[RETVAL_SROA_4_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_4_0_EXTRACT_SHIFT]] to i24
28
+ ; CHECK-NEXT: br label [[RETURN]]
24
29
; CHECK: return:
25
- ; COM: Check there are more than one PHI nodes to select scalarized values.
26
- ; CHECK-COUNT-3: phi
27
- ; CHECK: ret i64
30
+ ; CHECK-NEXT: [[RETVAL_SROA_4_SROA_0_0:%.*]] = phi i24 [ undef, [[IF_THEN]] ], [ [[RETVAL_SROA_4_0_EXTRACT_TRUNC]], [[IF_END]] ]
31
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0:%.*]] = phi i8 [ 0, [[IF_THEN]] ], [ [[RETVAL_SROA_3_0_EXTRACT_TRUNC]], [[IF_END]] ]
32
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[RETVAL_SROA_0_0_EXTRACT_TRUNC]], [[IF_END]] ]
33
+ ; CHECK-NEXT: [[RETVAL_SROA_4_0_INSERT_EXT:%.*]] = zext i24 [[RETVAL_SROA_4_SROA_0_0]] to i64
34
+ ; CHECK-NEXT: [[RETVAL_SROA_4_0_INSERT_SHIFT:%.*]] = shl i64 [[RETVAL_SROA_4_0_INSERT_EXT]], 40
35
+ ; CHECK-NEXT: [[RETVAL_SROA_4_0_INSERT_MASK:%.*]] = and i64 undef, 1099511627775
36
+ ; CHECK-NEXT: [[RETVAL_SROA_4_0_INSERT_INSERT:%.*]] = or i64 [[RETVAL_SROA_4_0_INSERT_MASK]], [[RETVAL_SROA_4_0_INSERT_SHIFT]]
37
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_EXT:%.*]] = zext i8 [[RETVAL_SROA_3_0]] to i64
38
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_SHIFT:%.*]] = shl i64 [[RETVAL_SROA_3_0_INSERT_EXT]], 32
39
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_MASK:%.*]] = and i64 [[RETVAL_SROA_4_0_INSERT_INSERT]], -1095216660481
40
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_INSERT:%.*]] = or i64 [[RETVAL_SROA_3_0_INSERT_MASK]], [[RETVAL_SROA_3_0_INSERT_SHIFT]]
41
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[RETVAL_SROA_0_0]] to i64
42
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_MASK:%.*]] = and i64 [[RETVAL_SROA_3_0_INSERT_INSERT]], -4294967296
43
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT:%.*]] = or i64 [[RETVAL_SROA_0_0_INSERT_MASK]], [[RETVAL_SROA_0_0_INSERT_EXT]]
44
+ ; CHECK-NEXT: ret i64 [[RETVAL_SROA_0_0_INSERT_INSERT]]
28
45
;
29
46
entry:
30
47
%retval = alloca %struct.RetValIntChar , align 4
@@ -53,16 +70,28 @@ return: ; preds = %if.end, %if.then
53
70
define i64 @test_struct_of_two_int (i1 zeroext %test , i64 ()* %p ) {
54
71
; CHECK-LABEL: @test_struct_of_two_int(
55
72
; CHECK-NEXT: entry:
56
- ; CHECK-NOT : alloca
73
+ ; CHECK-NEXT : br i1 [[TEST:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
57
74
; CHECK: if.then:
58
75
; CHECK-NEXT: br label [[RETURN:%.*]]
59
76
; CHECK: if.end:
60
- ; CHECK-NEXT: call i64
77
+ ; CHECK-NEXT: [[CALL:%.*]] = call i64 [[P:%.*]]()
78
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[CALL]] to i32
79
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_EXTRACT_SHIFT:%.*]] = lshr i64 [[CALL]], 32
80
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_3_0_EXTRACT_SHIFT]] to i32
81
+ ; CHECK-NEXT: br label [[RETURN]]
61
82
; CHECK: return:
62
- ; COM: Check that there are more than one PHI nodes to select the scalarized values.
63
- ; CHECK-COUNT-2: phi
64
- ; CHECK: ret i64
83
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[RETVAL_SROA_3_0_EXTRACT_TRUNC]], [[IF_END]] ]
84
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[RETVAL_SROA_0_0_EXTRACT_TRUNC]], [[IF_END]] ]
85
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_EXT:%.*]] = zext i32 [[RETVAL_SROA_3_0]] to i64
86
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_SHIFT:%.*]] = shl i64 [[RETVAL_SROA_3_0_INSERT_EXT]], 32
87
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_MASK:%.*]] = and i64 undef, 4294967295
88
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_INSERT:%.*]] = or i64 [[RETVAL_SROA_3_0_INSERT_MASK]], [[RETVAL_SROA_3_0_INSERT_SHIFT]]
89
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[RETVAL_SROA_0_0]] to i64
90
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_MASK:%.*]] = and i64 [[RETVAL_SROA_3_0_INSERT_INSERT]], -4294967296
91
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT:%.*]] = or i64 [[RETVAL_SROA_0_0_INSERT_MASK]], [[RETVAL_SROA_0_0_INSERT_EXT]]
92
+ ; CHECK-NEXT: ret i64 [[RETVAL_SROA_0_0_INSERT_INSERT]]
65
93
;
94
+
66
95
entry:
67
96
%retval = alloca %struct.RetValTwoInts , align 4
68
97
br i1 %test , label %if.then , label %if.end
@@ -91,16 +120,30 @@ return: ; preds = %if.end, %if.then
91
120
define i64 @test_one_field_has_runtime_value (i1 zeroext %test , i64 ()* %p ) {
92
121
; CHECK-LABEL: @test_one_field_has_runtime_value(
93
122
; CHECK-NEXT: entry:
94
- ; CHECK-NOT: alloca
95
- ; CHECK: call void @srand
123
+ ; CHECK-NEXT: [[CALL:%.*]] = call i64 @time(i64* null)
124
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[CALL]] to i32
125
+ ; CHECK-NEXT: call void @srand(i32 [[CONV]])
126
+ ; CHECK-NEXT: br i1 [[TEST:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
96
127
; CHECK: if.then:
97
- ; CHECK-NEXT: call i32 @rand()
98
- ; CHECK-NEXT: br label
128
+ ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @rand()
129
+ ; CHECK-NEXT: br label [[RETURN:%.*]]
99
130
; CHECK: if.end:
100
- ; CHECK-NEXT: call i64
131
+ ; CHECK-NEXT: [[CALL2:%.*]] = call i64 [[P:%.*]]()
132
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[CALL2]] to i32
133
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_EXTRACT_SHIFT:%.*]] = lshr i64 [[CALL2]], 32
134
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_3_0_EXTRACT_SHIFT]] to i32
135
+ ; CHECK-NEXT: br label [[RETURN]]
101
136
; CHECK: return:
102
- ; CHECK-COUNT-2: phi i32
103
- ; CHECK: ret i64
137
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[RETVAL_SROA_3_0_EXTRACT_TRUNC]], [[IF_END]] ]
138
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0:%.*]] = phi i32 [ [[CALL1]], [[IF_THEN]] ], [ [[RETVAL_SROA_0_0_EXTRACT_TRUNC]], [[IF_END]] ]
139
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_EXT:%.*]] = zext i32 [[RETVAL_SROA_3_0]] to i64
140
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_SHIFT:%.*]] = shl i64 [[RETVAL_SROA_3_0_INSERT_EXT]], 32
141
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_MASK:%.*]] = and i64 undef, 4294967295
142
+ ; CHECK-NEXT: [[RETVAL_SROA_3_0_INSERT_INSERT:%.*]] = or i64 [[RETVAL_SROA_3_0_INSERT_MASK]], [[RETVAL_SROA_3_0_INSERT_SHIFT]]
143
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[RETVAL_SROA_0_0]] to i64
144
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_MASK:%.*]] = and i64 [[RETVAL_SROA_3_0_INSERT_INSERT]], -4294967296
145
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT:%.*]] = or i64 [[RETVAL_SROA_0_0_INSERT_MASK]], [[RETVAL_SROA_0_0_INSERT_EXT]]
146
+ ; CHECK-NEXT: ret i64 [[RETVAL_SROA_0_0_INSERT_INSERT]]
104
147
;
105
148
entry:
106
149
%retval = alloca %struct.RetValTwoInts , align 4
0 commit comments