OLD | NEW |
1 ; This tests the optimization where producers and consumers of i1 (bool) | 1 ; This tests the optimization where producers and consumers of i1 (bool) |
2 ; variables are combined to implicitly use flags instead of explicitly using | 2 ; variables are combined to implicitly use flags instead of explicitly using |
3 ; stack or register variables. | 3 ; stack or register variables. |
4 | 4 |
5 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 | FileCheck %s | 5 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 | FileCheck %s |
6 | 6 |
7 declare void @use_value(i32) | 7 declare void @use_value(i32) |
8 | 8 |
9 ; Basic cmp/branch folding. | 9 ; Basic cmp/branch folding. |
10 define i32 @fold_cmp_br(i32 %arg1, i32 %arg2) { | 10 define i32 @fold_cmp_br(i32 %arg1, i32 %arg2) { |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 %cmp1 = icmp slt i32 %arg1_trunc, %arg2_trunc | 102 %cmp1 = icmp slt i32 %arg1_trunc, %arg2_trunc |
103 %result = select i1 %cmp1, i64 %arg1, i64 %arg2 | 103 %result = select i1 %cmp1, i64 %arg1, i64 %arg2 |
104 ret i64 %result | 104 ret i64 %result |
105 } | 105 } |
106 | 106 |
107 ; CHECK-LABEL: fold_cmp_select_64 | 107 ; CHECK-LABEL: fold_cmp_select_64 |
108 ; CHECK: cmp | 108 ; CHECK: cmp |
109 ; CHECK: cmovl | 109 ; CHECK: cmovl |
110 ; CHECK: cmovl | 110 ; CHECK: cmovl |
111 | 111 |
| 112 define i64 @fold_cmp_select_64_undef(i64 %arg1) { |
| 113 entry: |
| 114 %arg1_trunc = trunc i64 %arg1 to i32 |
| 115 %cmp1 = icmp slt i32 undef, %arg1_trunc |
| 116 %result = select i1 %cmp1, i64 %arg1, i64 undef |
| 117 ret i64 %result |
| 118 } |
| 119 ; CHECK-LABEL: fold_cmp_select_64_undef |
| 120 ; CHECK: cmp |
| 121 ; CHECK: cmovl |
| 122 ; CHECK: cmovl |
112 | 123 |
113 ; Cmp/select folding with intervening instructions. | 124 ; Cmp/select folding with intervening instructions. |
114 define i32 @fold_cmp_select_intervening_insts(i32 %arg1, i32 %arg2) { | 125 define i32 @fold_cmp_select_intervening_insts(i32 %arg1, i32 %arg2) { |
115 entry: | 126 entry: |
116 %cmp1 = icmp slt i32 %arg1, %arg2 | 127 %cmp1 = icmp slt i32 %arg1, %arg2 |
117 call void @use_value(i32 %arg1) | 128 call void @use_value(i32 %arg1) |
118 %result = select i1 %cmp1, i32 %arg1, i32 %arg2 | 129 %result = select i1 %cmp1, i32 %arg1, i32 %arg2 |
119 ret i32 %result | 130 ret i32 %result |
120 } | 131 } |
121 | 132 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 ; CHECK: cmp | 205 ; CHECK: cmp |
195 ; CHECK: cmovne | 206 ; CHECK: cmovne |
196 ; CHECK: cmp | 207 ; CHECK: cmp |
197 ; CHECK: cmovne | 208 ; CHECK: cmovne |
198 ; CHECK: cmp | 209 ; CHECK: cmp |
199 ; CHECK: cmove | 210 ; CHECK: cmove |
200 ; CHECK: movzx | 211 ; CHECK: movzx |
201 ; CHECK: add | 212 ; CHECK: add |
202 ; CHECK: add | 213 ; CHECK: add |
203 ; CHECK: add | 214 ; CHECK: add |
OLD | NEW |