2
2
; RUN: opt < %s -passes=newgvn -S | FileCheck %s
3
3
; RUN: opt < %s -passes=newgvn,jump-threading -S | FileCheck --check-prefix=CHECK-JT %s
4
4
5
- define signext i32 @testBI (i32 signext %v ) {
6
5
; Test with std::pair<bool, int>
7
6
; based on the following C++ code
8
7
; std::pair<bool, int> callee(int v) {
@@ -15,13 +14,63 @@ define signext i32 @testBI(i32 signext %v) {
15
14
; if (rc.first) dummy(0);
16
15
; return rc.second;
17
16
; }
17
+ define signext i32 @testBI (i32 signext %v ) {
18
18
; CHECK-LABEL: @testBI(
19
- ; CHECK: _ZL6calleei.exit:
20
- ; CHECK: [[PHIOFOPS:%.*]] = phi i64 [ 1, %if.then.i ], [ {{%.*}}, %if.else.i ]
21
- ; CHECK: [[TOBOOL:%.*]] = icmp eq i64 [[PHIOFOPS]], 0
19
+ ; CHECK-NEXT: entry:
20
+ ; CHECK-NEXT: [[CALL_I:%.*]] = call signext i32 @dummy(i32 signext [[V:%.*]])
21
+ ; CHECK-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[CALL_I]], 0
22
+ ; CHECK-NEXT: br i1 [[TOBOOL_I]], label [[IF_ELSE_I:%.*]], label [[IF_THEN_I:%.*]]
23
+ ; CHECK: if.then.i:
24
+ ; CHECK-NEXT: [[CALL2_I:%.*]] = call signext i32 @dummy(i32 signext [[CALL_I]])
25
+ ; CHECK-NEXT: [[RETVAL_SROA_22_0_INSERT_EXT_I_I:%.*]] = zext i32 [[CALL2_I]] to i64
26
+ ; CHECK-NEXT: [[RETVAL_SROA_22_0_INSERT_SHIFT_I_I:%.*]] = shl nuw i64 [[RETVAL_SROA_22_0_INSERT_EXT_I_I]], 32
27
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I_I:%.*]] = or i64 [[RETVAL_SROA_22_0_INSERT_SHIFT_I_I]], 1
28
+ ; CHECK-NEXT: br label [[_ZL6CALLEEI_EXIT:%.*]]
29
+ ; CHECK: if.else.i:
30
+ ; CHECK-NEXT: [[DOTLOBIT_I:%.*]] = lshr i32 [[V]], 31
31
+ ; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[DOTLOBIT_I]] to i64
32
+ ; CHECK-NEXT: [[RETVAL_SROA_22_0_INSERT_EXT_I8_I:%.*]] = zext i32 [[V]] to i64
33
+ ; CHECK-NEXT: [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I:%.*]] = shl nuw i64 [[RETVAL_SROA_22_0_INSERT_EXT_I8_I]], 32
34
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I11_I:%.*]] = or i64 [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I]], [[TMP0]]
35
+ ; CHECK-NEXT: br label [[_ZL6CALLEEI_EXIT]]
36
+ ; CHECK: _ZL6calleei.exit:
37
+ ; CHECK-NEXT: [[PHIOFOPS1:%.*]] = phi i64 [ [[RETVAL_SROA_22_0_INSERT_EXT_I_I]], [[IF_THEN_I]] ], [ [[RETVAL_SROA_22_0_INSERT_EXT_I8_I]], [[IF_ELSE_I]] ]
38
+ ; CHECK-NEXT: [[PHIOFOPS:%.*]] = phi i64 [ 1, [[IF_THEN_I]] ], [ [[TMP0]], [[IF_ELSE_I]] ]
39
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_I:%.*]] = phi i64 [ [[RETVAL_SROA_0_0_INSERT_INSERT_I_I]], [[IF_THEN_I]] ], [ [[RETVAL_SROA_0_0_INSERT_INSERT_I11_I]], [[IF_ELSE_I]] ]
40
+ ; CHECK-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[PHIOFOPS1]] to i32
41
+ ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[PHIOFOPS]], 0
42
+ ; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
43
+ ; CHECK: if.then:
44
+ ; CHECK-NEXT: [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
45
+ ; CHECK-NEXT: br label [[IF_END]]
46
+ ; CHECK: if.end:
47
+ ; CHECK-NEXT: ret i32 [[RC_SROA_43_0_EXTRACT_TRUNC]]
22
48
;
23
49
; CHECK-JT-LABEL: @testBI(
50
+ ; CHECK-JT-NEXT: entry:
51
+ ; CHECK-JT-NEXT: [[CALL_I:%.*]] = call signext i32 @dummy(i32 signext [[V:%.*]])
52
+ ; CHECK-JT-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[CALL_I]], 0
53
+ ; CHECK-JT-NEXT: br i1 [[TOBOOL_I]], label [[_ZL6CALLEEI_EXIT:%.*]], label [[_ZL6CALLEEI_EXIT_THREAD:%.*]]
24
54
; CHECK-JT: _ZL6calleei.exit.thread:
55
+ ; CHECK-JT-NEXT: [[CALL2_I:%.*]] = call signext i32 @dummy(i32 signext [[CALL_I]])
56
+ ; CHECK-JT-NEXT: [[RETVAL_SROA_22_0_INSERT_EXT_I_I:%.*]] = zext i32 [[CALL2_I]] to i64
57
+ ; CHECK-JT-NEXT: br label [[IF_THEN:%.*]]
58
+ ; CHECK-JT: _ZL6calleei.exit:
59
+ ; CHECK-JT-NEXT: [[DOTLOBIT_I:%.*]] = lshr i32 [[V]], 31
60
+ ; CHECK-JT-NEXT: [[TMP0:%.*]] = zext i32 [[DOTLOBIT_I]] to i64
61
+ ; CHECK-JT-NEXT: [[RETVAL_SROA_22_0_INSERT_EXT_I8_I:%.*]] = zext i32 [[V]] to i64
62
+ ; CHECK-JT-NEXT: [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I:%.*]] = shl nuw i64 [[RETVAL_SROA_22_0_INSERT_EXT_I8_I]], 32
63
+ ; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I11_I:%.*]] = or i64 [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I]], [[TMP0]]
64
+ ; CHECK-JT-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_22_0_INSERT_EXT_I8_I]] to i32
65
+ ; CHECK-JT-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[TMP0]], 0
66
+ ; CHECK-JT-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN]]
67
+ ; CHECK-JT: if.then:
68
+ ; CHECK-JT-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC7:%.*]] = phi i32 [ [[CALL2_I]], [[_ZL6CALLEEI_EXIT_THREAD]] ], [ [[RC_SROA_43_0_EXTRACT_TRUNC]], [[_ZL6CALLEEI_EXIT]] ]
69
+ ; CHECK-JT-NEXT: [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
70
+ ; CHECK-JT-NEXT: br label [[IF_END]]
71
+ ; CHECK-JT: if.end:
72
+ ; CHECK-JT-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC8:%.*]] = phi i32 [ [[RC_SROA_43_0_EXTRACT_TRUNC7]], [[IF_THEN]] ], [ [[RC_SROA_43_0_EXTRACT_TRUNC]], [[_ZL6CALLEEI_EXIT]] ]
73
+ ; CHECK-JT-NEXT: ret i32 [[RC_SROA_43_0_EXTRACT_TRUNC8]]
25
74
;
26
75
27
76
entry:
@@ -61,7 +110,6 @@ if.end: ; preds = %_ZL6calleei.exit, %
61
110
}
62
111
63
112
64
- define signext i32 @testIB (i32 signext %v ) {
65
113
; Test with std::pair<int, bool>
66
114
; based on the following C++ code
67
115
; std::pair<int, bool> callee(int v) {
@@ -74,13 +122,63 @@ define signext i32 @testIB(i32 signext %v) {
74
122
; if (rc.second) dummy(0);
75
123
; return rc.first;
76
124
; }
125
+ define signext i32 @testIB (i32 signext %v ) {
77
126
; CHECK-LABEL: @testIB(
78
- ; CHECK: _ZL6calleei.exit:
79
- ; CHECK: [[PHIOFOPS:%.*]] = phi i64 [ 4294967296, %if.then.i ], [ {{%.*}}, %if.else.i ]
80
- ; CHECK: [[TOBOOL:%.*]] = icmp eq i64 [[PHIOFOPS]], 0
127
+ ; CHECK-NEXT: entry:
128
+ ; CHECK-NEXT: [[CALL_I:%.*]] = call signext i32 @dummy(i32 signext [[V:%.*]])
129
+ ; CHECK-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[CALL_I]], 0
130
+ ; CHECK-NEXT: br i1 [[TOBOOL_I]], label [[IF_ELSE_I:%.*]], label [[IF_THEN_I:%.*]]
131
+ ; CHECK: if.then.i:
132
+ ; CHECK-NEXT: [[CALL1_I:%.*]] = call signext i32 @dummy(i32 signext [[V]])
133
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_EXT_I_I:%.*]] = zext i32 [[CALL1_I]] to i64
134
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I_I:%.*]] = or i64 [[RETVAL_SROA_0_0_INSERT_EXT_I_I]], 4294967296
135
+ ; CHECK-NEXT: br label [[_ZL6CALLEEI_EXIT:%.*]]
136
+ ; CHECK: if.else.i:
137
+ ; CHECK-NEXT: [[DOTLOBIT_I:%.*]] = lshr i32 [[V]], 31
138
+ ; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[DOTLOBIT_I]] to i64
139
+ ; CHECK-NEXT: [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I:%.*]] = shl nuw nsw i64 [[TMP0]], 32
140
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_EXT_I9_I:%.*]] = zext i32 [[V]] to i64
141
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I:%.*]] = or i64 [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], [[RETVAL_SROA_0_0_INSERT_EXT_I9_I]]
142
+ ; CHECK-NEXT: br label [[_ZL6CALLEEI_EXIT]]
143
+ ; CHECK: _ZL6calleei.exit:
144
+ ; CHECK-NEXT: [[PHIOFOPS:%.*]] = phi i64 [ 4294967296, [[IF_THEN_I]] ], [ [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], [[IF_ELSE_I]] ]
145
+ ; CHECK-NEXT: [[RETVAL_SROA_0_0_I:%.*]] = phi i64 [ [[RETVAL_SROA_0_0_INSERT_INSERT_I_I]], [[IF_THEN_I]] ], [ [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I]], [[IF_ELSE_I]] ]
146
+ ; CHECK-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_0_0_I]] to i32
147
+ ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[PHIOFOPS]], 0
148
+ ; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
149
+ ; CHECK: if.then:
150
+ ; CHECK-NEXT: [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
151
+ ; CHECK-NEXT: br label [[IF_END]]
152
+ ; CHECK: if.end:
153
+ ; CHECK-NEXT: ret i32 [[RC_SROA_0_0_EXTRACT_TRUNC]]
81
154
;
82
155
; CHECK-JT-LABEL: @testIB(
156
+ ; CHECK-JT-NEXT: entry:
157
+ ; CHECK-JT-NEXT: [[CALL_I:%.*]] = call signext i32 @dummy(i32 signext [[V:%.*]])
158
+ ; CHECK-JT-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[CALL_I]], 0
159
+ ; CHECK-JT-NEXT: br i1 [[TOBOOL_I]], label [[_ZL6CALLEEI_EXIT:%.*]], label [[_ZL6CALLEEI_EXIT_THREAD:%.*]]
83
160
; CHECK-JT: _ZL6calleei.exit.thread:
161
+ ; CHECK-JT-NEXT: [[CALL1_I:%.*]] = call signext i32 @dummy(i32 signext [[V]])
162
+ ; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_EXT_I_I:%.*]] = zext i32 [[CALL1_I]] to i64
163
+ ; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I_I:%.*]] = or i64 [[RETVAL_SROA_0_0_INSERT_EXT_I_I]], 4294967296
164
+ ; CHECK-JT-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC3:%.*]] = trunc i64 [[RETVAL_SROA_0_0_INSERT_INSERT_I_I]] to i32
165
+ ; CHECK-JT-NEXT: br label [[IF_THEN:%.*]]
166
+ ; CHECK-JT: _ZL6calleei.exit:
167
+ ; CHECK-JT-NEXT: [[DOTLOBIT_I:%.*]] = lshr i32 [[V]], 31
168
+ ; CHECK-JT-NEXT: [[TMP0:%.*]] = zext i32 [[DOTLOBIT_I]] to i64
169
+ ; CHECK-JT-NEXT: [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I:%.*]] = shl nuw nsw i64 [[TMP0]], 32
170
+ ; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_EXT_I9_I:%.*]] = zext i32 [[V]] to i64
171
+ ; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I:%.*]] = or i64 [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], [[RETVAL_SROA_0_0_INSERT_EXT_I9_I]]
172
+ ; CHECK-JT-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I]] to i32
173
+ ; CHECK-JT-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], 0
174
+ ; CHECK-JT-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN]]
175
+ ; CHECK-JT: if.then:
176
+ ; CHECK-JT-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC5:%.*]] = phi i32 [ [[RC_SROA_0_0_EXTRACT_TRUNC3]], [[_ZL6CALLEEI_EXIT_THREAD]] ], [ [[RC_SROA_0_0_EXTRACT_TRUNC]], [[_ZL6CALLEEI_EXIT]] ]
177
+ ; CHECK-JT-NEXT: [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
178
+ ; CHECK-JT-NEXT: br label [[IF_END]]
179
+ ; CHECK-JT: if.end:
180
+ ; CHECK-JT-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC6:%.*]] = phi i32 [ [[RC_SROA_0_0_EXTRACT_TRUNC5]], [[IF_THEN]] ], [ [[RC_SROA_0_0_EXTRACT_TRUNC]], [[_ZL6CALLEEI_EXIT]] ]
181
+ ; CHECK-JT-NEXT: ret i32 [[RC_SROA_0_0_EXTRACT_TRUNC6]]
84
182
;
85
183
86
184
entry:
0 commit comments