744 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -o - %s -mtriple=x86_64-- -run-pass peephole-opt | FileCheck %s3 4---5name: opt_zerocmp_06body: |7 bb.0:8 ; CHECK-LABEL: name: opt_zerocmp_09 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi10 ; CHECK-NEXT: [[XOR32ri:%[0-9]+]]:gr32 = XOR32ri [[COPY]], i32 1234, implicit-def $eflags11 ; CHECK-NEXT: $al = SETCCr 5, implicit $eflags12 %0:gr32 = COPY $esi13 %1:gr32 = XOR32ri %0, i32 1234, implicit-def $eflags14 ; TEST should be removed.15 TEST32rr %1, %1, implicit-def $eflags16 $al = SETCCr 5, implicit $eflags17...18---19name: opt_zerocmp_120body: |21 bb.0:22 ; CHECK-LABEL: name: opt_zerocmp_123 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi24 ; CHECK-NEXT: [[DEC64r:%[0-9]+]]:gr64 = DEC64r [[COPY]], implicit-def $eflags25 ; CHECK-NEXT: [[LEA64r:%[0-9]+]]:gr64 = LEA64r [[DEC64r]], 5, $noreg, 12, $noreg26 ; CHECK-NEXT: $al = SETCCr 4, implicit $eflags27 %0:gr64 = COPY $rsi28 %1:gr64 = DEC64r %0, implicit-def $eflags29 ; CMP should be removed.30 CMP64ri32 %1, 0, implicit-def $eflags31 %2:gr64 = LEA64r %1, 5, $noreg, 12, $noreg32 $al = SETCCr 4, implicit $eflags33...34---35name: opt_multiple_blocks36tracksRegLiveness: true37body: |38 ; CHECK-LABEL: name: opt_multiple_blocks39 ; CHECK: bb.0:40 ; CHECK-NEXT: successors: %bb.1(0x80000000)41 ; CHECK-NEXT: {{ $}}42 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY undef $rsi43 ; CHECK-NEXT: [[INC64r:%[0-9]+]]:gr64 = INC64r [[COPY]], implicit-def $eflags44 ; CHECK-NEXT: PUSH64r undef $rcx, implicit-def $rsp, implicit $rsp45 ; CHECK-NEXT: $rcx = POP64r implicit-def $rsp, implicit $rsp46 ; CHECK-NEXT: JMP_1 %bb.147 ; CHECK-NEXT: {{ $}}48 ; CHECK-NEXT: bb.1:49 ; CHECK-NEXT: liveins: $eflags50 ; CHECK-NEXT: {{ $}}51 ; CHECK-NEXT: [[LEA64r:%[0-9]+]]:gr64 = LEA64r [[INC64r]], 5, $noreg, 12, $noreg52 ; CHECK-NEXT: $al = SETCCr 4, implicit $eflags53 bb.0:54 %0:gr64 = COPY undef $rsi55 %1:gr64 = INC64r %0, implicit-def $eflags56 PUSH64r undef $rcx, implicit-def $rsp, implicit $rsp57 $rcx = POP64r implicit-def $rsp, implicit $rsp58 JMP_1 %bb.159 60 bb.1:61 ; TEST should be removed.62 TEST64rr %1, %1, implicit-def $eflags63 %2:gr64 = LEA64r %1, 5, $noreg, 12, $noreg64 $al = SETCCr 4, implicit $eflags65...66---67name: opt_multiple_blocks_noopt_068body: |69 ; CHECK-LABEL: name: opt_multiple_blocks_noopt_070 ; CHECK: bb.0:71 ; CHECK-NEXT: successors: %bb.1(0x80000000)72 ; CHECK-NEXT: {{ $}}73 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY undef $rsi74 ; CHECK-NEXT: [[INC64r:%[0-9]+]]:gr64 = INC64r [[COPY]], implicit-def $eflags75 ; CHECK-NEXT: JMP_1 %bb.176 ; CHECK-NEXT: {{ $}}77 ; CHECK-NEXT: bb.1:78 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)79 ; CHECK-NEXT: {{ $}}80 ; CHECK-NEXT: TEST64rr [[INC64r]], [[INC64r]], implicit-def $eflags81 ; CHECK-NEXT: [[LEA64r:%[0-9]+]]:gr64 = LEA64r [[INC64r]], 5, $noreg, 12, $noreg82 ; CHECK-NEXT: $al = SETCCr 4, implicit $eflags83 ; CHECK-NEXT: JCC_1 %bb.1, 2, implicit $eflags84 ; CHECK-NEXT: {{ $}}85 ; CHECK-NEXT: bb.2:86 bb.0:87 %0:gr64 = COPY undef $rsi88 %1:gr64 = INC64r %0, implicit-def $eflags89 JMP_1 %bb.190 91 bb.1:92 ; The TEST64rr should not be removed, since there are multiple preds.93 TEST64rr %1, %1, implicit-def $eflags94 %2:gr64 = LEA64r %1, 5, $noreg, 12, $noreg95 $al = SETCCr 4, implicit $eflags96 JCC_1 %bb.1, 2, implicit $eflags97 98 bb.2:99...100---101name: opt_multiple_blocks_noopt_1102body: |103 ; CHECK-LABEL: name: opt_multiple_blocks_noopt_1104 ; CHECK: bb.0:105 ; CHECK-NEXT: successors: %bb.1(0x80000000)106 ; CHECK-NEXT: {{ $}}107 ; CHECK-NEXT: JMP_1 %bb.1108 ; CHECK-NEXT: {{ $}}109 ; CHECK-NEXT: bb.1:110 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)111 ; CHECK-NEXT: {{ $}}112 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY undef $rsi113 ; CHECK-NEXT: TEST64rr [[COPY]], [[COPY]], implicit-def $eflags114 ; CHECK-NEXT: JCC_1 %bb.1, 2, implicit $eflags115 ; CHECK-NEXT: {{ $}}116 ; CHECK-NEXT: bb.2:117 ; CHECK-NEXT: [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def $eflags118 ; CHECK-NEXT: TEST64rr [[COPY]], [[COPY]], implicit-def $eflags119 ; CHECK-NEXT: $al = SETCCr 4, implicit $eflags120 bb.0:121 JMP_1 %bb.1122 123 bb.1:124 %0:gr64 = COPY undef $rsi125 TEST64rr %0, %0, implicit-def $eflags126 JCC_1 %bb.1, 2, implicit $eflags127 128 bb.2:129 ; We should not move MOV32r0 up into the loop (that would be correct but130 ; slow).131 %1:gr32 = MOV32r0 implicit-def $eflags132 ; TEST should not be removed because of MOV32r0.133 TEST64rr %0, %0, implicit-def $eflags134 $al = SETCCr 4, implicit $eflags135...136---137name: opt_zerocmp_user_0138body: |139 bb.0:140 ; CHECK-LABEL: name: opt_zerocmp_user_0141 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi142 ; CHECK-NEXT: [[NEG32r:%[0-9]+]]:gr32 = NEG32r [[COPY]], implicit-def $eflags143 ; CHECK-NEXT: $al = SETCCr 3, implicit $eflags144 %0:gr32 = COPY $esi145 %1:gr32 = NEG32r %0, implicit-def dead $eflags146 ; TEST should be removed.147 TEST32rr %0, %0, implicit-def $eflags148 $al = SETCCr 4, implicit $eflags149...150---151name: opt_redundant_flags_0152body: |153 bb.0:154 ; CHECK-LABEL: name: opt_redundant_flags_0155 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi156 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi157 ; CHECK-NEXT: [[SUB32rr:%[0-9]+]]:gr32 = SUB32rr [[COPY]], [[COPY1]], implicit-def $eflags158 ; CHECK-NEXT: $eax = COPY [[SUB32rr]]159 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags160 %0:gr32 = COPY $esi161 %1:gr32 = COPY $edi162 %2:gr32 = SUB32rr %0, %1, implicit-def dead $eflags163 $eax = COPY %2164 ; CMP should be removed.165 CMP32rr %0, %1, implicit-def $eflags166 $bl = SETCCr 2, implicit $eflags167...168---169name: opt_redundant_flags_1170body: |171 bb.0:172 ; CHECK-LABEL: name: opt_redundant_flags_1173 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi174 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi175 ; CHECK-NEXT: [[SUB32rr:%[0-9]+]]:gr32 = SUB32rr [[COPY]], [[COPY1]], implicit-def $eflags176 ; CHECK-NEXT: $eax = COPY [[SUB32rr]]177 ; CHECK-NEXT: $bl = SETCCr 6, implicit $eflags178 %0:gr32 = COPY $esi179 %1:gr32 = COPY $edi180 %2:gr32 = SUB32rr %0, %1, implicit-def dead $eflags181 $eax = COPY %2182 ; CMP should be removed.183 CMP32rr %1, %0, implicit-def $eflags184 $bl = SETCCr 3, implicit $eflags185...186---187name: opt_redundant_flags_2188body: |189 bb.0:190 ; CHECK-LABEL: name: opt_redundant_flags_2191 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi192 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi193 ; CHECK-NEXT: [[SUB32rr:%[0-9]+]]:gr32 = SUB32rr [[COPY]], [[COPY1]], implicit-def $eflags194 ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags195 ; CHECK-NEXT: $eax = COPY [[SUB32rr]]196 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags197 %0:gr32 = COPY $esi198 %1:gr32 = COPY $edi199 %2:gr32 = SUB32rr %0, %1, implicit-def $eflags200 ; an extra eflags reader shouldn't stop optimization.201 $cl = SETCCr 2, implicit $eflags202 $eax = COPY %2203 CMP32rr %0, %1, implicit-def $eflags204 $bl = SETCCr 2, implicit $eflags205...206---207name: opt_redundant_flags_cmp_cmp208body: |209 bb.0:210 ; CHECK-LABEL: name: opt_redundant_flags_cmp_cmp211 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi212 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi213 ; CHECK-NEXT: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags214 ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags215 ; CHECK-NEXT: $bl = SETCCr 7, implicit $eflags216 %0:gr32 = COPY $esi217 %1:gr32 = COPY $edi218 CMP32rr %0, %1, implicit-def $eflags219 $cl = SETCCr 2, implicit $eflags220 ; 2nd CMP should be removed.221 CMP32rr %1, %0, implicit-def $eflags222 $bl = SETCCr 2, implicit $eflags223...224---225name: opt_redundant_flags_cmp_cmp_2226body: |227 bb.0:228 ; CHECK-LABEL: name: opt_redundant_flags_cmp_cmp_2229 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi230 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rdi231 ; CHECK-NEXT: CMP64ri32 [[COPY]], 15, implicit-def $eflags232 ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags233 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags234 %0:gr64 = COPY $rsi235 %1:gr64 = COPY $rdi236 CMP64ri32 %0, 15, implicit-def $eflags237 $cl = SETCCr 2, implicit $eflags238 ; 2nd CMP should be removed.239 CMP64ri32 %0, 15, implicit-def $eflags240 $bl = SETCCr 2, implicit $eflags241...242---243name: opt_redundant_flags_test_test244body: |245 bb.0:246 ; CHECK-LABEL: name: opt_redundant_flags_test_test247 ; CHECK: [[COPY:%[0-9]+]]:gr16 = COPY $ax248 ; CHECK-NEXT: TEST16rr [[COPY]], [[COPY]], implicit-def $eflags249 ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags250 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags251 %0:gr16 = COPY $ax252 TEST16rr %0, %0, implicit-def $eflags253 $cl = SETCCr 2, implicit $eflags254 ; 2nd CMP should be removed.255 TEST16rr %0, %0, implicit-def $eflags256 $bl = SETCCr 2, implicit $eflags257...258---259name: opt_redundant_flags_cmp_sub260body: |261 bb.0:262 ; CHECK-LABEL: name: opt_redundant_flags_cmp_sub263 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi264 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi265 ; CHECK-NEXT: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags266 ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags267 ; CHECK-NEXT: $bl = SETCCr 7, implicit $eflags268 %0:gr32 = COPY $esi269 %1:gr32 = COPY $edi270 CMP32rr %0, %1, implicit-def $eflags271 $cl = SETCCr 2, implicit $eflags272 ; SUB should be removed.273 dead %2:gr32 = SUB32rr %1, %0, implicit-def $eflags274 $bl = SETCCr 2, implicit $eflags275...276---277name: opt_redundant_flags_cmp_sub_2278body: |279 bb.0:280 ; CHECK-LABEL: name: opt_redundant_flags_cmp_sub_2281 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi282 ; CHECK-NEXT: CMP32ri [[COPY]], -12345, implicit-def $eflags283 ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags284 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags285 %0:gr32 = COPY $esi286 CMP32ri %0, -12345, implicit-def $eflags287 $cl = SETCCr 2, implicit $eflags288 ; SUB should be removed289 dead %2:gr32 = SUB32ri %0, -12345, implicit-def $eflags290 $bl = SETCCr 2, implicit $eflags291...292---293name: opt_redundant_flags_cmp_sub_noopt294body: |295 bb.0:296 ; CHECK-LABEL: name: opt_redundant_flags_cmp_sub_noopt297 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi298 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi299 ; CHECK-NEXT: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags300 ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags301 ; CHECK-NEXT: [[SUB32rr:%[0-9]+]]:gr32 = SUB32rr [[COPY]], [[COPY1]], implicit-def $eflags302 ; CHECK-NEXT: $rdx = COPY [[SUB32rr]]303 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags304 %0:gr32 = COPY $esi305 %1:gr32 = COPY $edi306 CMP32rr %0, %1, implicit-def $eflags307 $cl = SETCCr 2, implicit $eflags308 ; cannot optimize the SUB because the result value is used.309 %2:gr32 = SUB32rr %0, %1, implicit-def $eflags310 $rdx = COPY %2311 $bl = SETCCr 2, implicit $eflags312...313---314name: opt_redundant_flags_cmp_test315body: |316 bb.0:317 ; CHECK-LABEL: name: opt_redundant_flags_cmp_test318 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi319 ; CHECK-NEXT: CMP32ri [[COPY]], 0, implicit-def $eflags320 ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags321 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags322 %0:gr32 = COPY $esi323 CMP32ri %0, 0, implicit-def $eflags324 $cl = SETCCr 2, implicit $eflags325 ; TEST should be removed326 TEST32rr %0, %0, implicit-def $eflags327 $bl = SETCCr 2, implicit $eflags328...329---330name: opt_redundant_flags_test_cmp331body: |332 bb.0:333 ; CHECK-LABEL: name: opt_redundant_flags_test_cmp334 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi335 ; CHECK-NEXT: TEST32rr [[COPY]], [[COPY]], implicit-def $eflags336 ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags337 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags338 %0:gr32 = COPY $esi339 TEST32rr %0, %0, implicit-def $eflags340 $cl = SETCCr 2, implicit $eflags341 ; TEST should be removed342 CMP32ri %0, 0, implicit-def $eflags343 $bl = SETCCr 2, implicit $eflags344...345---346name: opt_redundant_flags_cmp_addr347stack:348 - { id: 0, size: 4, alignment: 4 }349body: |350 bb.0:351 ; CHECK-LABEL: name: opt_redundant_flags_cmp_addr352 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi353 ; CHECK-NEXT: CMP64ri32 [[COPY]], @opt_redundant_flags_cmp_addr + 4, implicit-def $eflags354 ; CHECK-NEXT: $cl = SETCCr 7, implicit $eflags355 ; CHECK-NEXT: $cl = SETCCr 3, implicit $eflags356 %0:gr64 = COPY $rsi357 CMP64ri32 %0, @opt_redundant_flags_cmp_addr + 4, implicit-def $eflags358 $cl = SETCCr 7, implicit $eflags359 ; CMP should be removed360 CMP64ri32 %0, @opt_redundant_flags_cmp_addr + 4, implicit-def $eflags361 $cl = SETCCr 3, implicit $eflags362...363---364name: opt_redundant_flags_cmp_addr_noopt365stack:366 - { id: 0, size: 4, alignment: 4 }367body: |368 bb.0:369 ; CHECK-LABEL: name: opt_redundant_flags_cmp_addr_noopt370 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi371 ; CHECK-NEXT: CMP64ri32 [[COPY]], @opt_redundant_flags_cmp_addr_noopt + 24, implicit-def $eflags372 ; CHECK-NEXT: $cl = SETCCr 7, implicit $eflags373 ; CHECK-NEXT: CMP64ri32 [[COPY]], 24, implicit-def $eflags374 ; CHECK-NEXT: $cl = SETCCr 3, implicit $eflags375 %0:gr64 = COPY $rsi376 CMP64ri32 %0, @opt_redundant_flags_cmp_addr_noopt + 24, implicit-def $eflags377 $cl = SETCCr 7, implicit $eflags378 ; CMP should not be removed379 CMP64ri32 %0, 24, implicit-def $eflags380 $cl = SETCCr 3, implicit $eflags381...382---383name: opt_redundant_flags_adjusted_imm_0384body: |385 bb.0:386 ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_0387 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi388 ; CHECK-NEXT: CMP64ri32 [[COPY]], 1, implicit-def $eflags389 ; CHECK-NEXT: $cl = SETCCr 4, implicit $eflags390 ; CHECK-NEXT: $bl = SETCCr 15, implicit $eflags391 ; CHECK-NEXT: $bl = SETCCr 7, implicit $eflags392 ; CHECK-NEXT: $bl = SETCCr 14, implicit $eflags393 ; CHECK-NEXT: $bl = SETCCr 6, implicit $eflags394 %0:gr64 = COPY $rsi395 ; CMP+SETCC %0 == 1396 CMP64ri32 %0, 1, implicit-def $eflags397 $cl = SETCCr 4, implicit $eflags398 ; CMP+SETCC %0 >= 2; CMP can be removed.399 CMP64ri32 %0, 2, implicit-def $eflags400 ; %0 >=s 2 --> %0 >s 1401 $bl = SETCCr 13, implicit $eflags402 ; %0 >=u 2 --> %0 >u 1403 $bl = SETCCr 3, implicit $eflags404 ; %0 <s 2 --> %0 <=s 1405 $bl = SETCCr 12, implicit $eflags406 ; %0 <u 2 --> %0 <=u 1407 $bl = SETCCr 2, implicit $eflags408...409---410name: opt_redundant_flags_adjusted_imm_1411body: |412 bb.0:413 ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_1414 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi415 ; CHECK-NEXT: CMP64ri32 [[COPY]], 42, implicit-def $eflags416 ; CHECK-NEXT: $cl = SETCCr 5, implicit $eflags417 ; CHECK-NEXT: $bl = SETCCr 13, implicit $eflags418 ; CHECK-NEXT: $bl = SETCCr 3, implicit $eflags419 ; CHECK-NEXT: $bl = SETCCr 12, implicit $eflags420 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags421 %0:gr64 = COPY $rsi422 ; CMP+SETCC %0 != 42423 CMP64ri32 %0, 42, implicit-def $eflags424 $cl = SETCCr 5, implicit $eflags425 ; CMP+SETCC %0 >= 2; CMP can be removed.426 CMP64ri32 %0, 41, implicit-def $eflags427 ; %0 >s 41 --> %0 >=s 42428 $bl = SETCCr 15, implicit $eflags429 ; %0 >u 41 --> %0 >=u 42430 $bl = SETCCr 7, implicit $eflags431 ; %0 <=s 41 --> %0 <s 42432 $bl = SETCCr 14, implicit $eflags433 ; %0 <=u 41 --> %0 <u 42434 $bl = SETCCr 6, implicit $eflags435...436---437name: opt_redundant_flags_adjusted_imm_test_cmp438body: |439 bb.0:440 ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_test_cmp441 ; CHECK: [[COPY:%[0-9]+]]:gr8 = COPY $bl442 ; CHECK-NEXT: TEST8rr [[COPY]], [[COPY]], implicit-def $eflags443 ; CHECK-NEXT: $cl = SETCCr 14, implicit $eflags444 ; CHECK-NEXT: $cl = SETCCr 7, implicit $eflags445 ; CHECK-NEXT: $cl = SETCCr 12, implicit $eflags446 %0:gr8 = COPY $bl447 TEST8rr %0, %0, implicit-def $eflags448 ; SET %0 <=s 0449 $cl = SETCCr 14, implicit $eflags450 ; CMP should be removed (%0 >=u 1)451 CMP8ri %0, 1, implicit-def $eflags452 $cl = SETCCr 3, implicit $eflags453 454 ; CMP should be removed (%0 <=s -1)455 CMP8ri %0, -1, implicit-def $eflags456 $cl = SETCCr 14, implicit $eflags457...458---459name: opt_redundant_flags_adjusted_imm_cmp_test460body: |461 bb.0:462 ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_cmp_test463 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi464 ; CHECK-NEXT: CMP64ri32 [[COPY]], 1, implicit-def $eflags465 ; CHECK-NEXT: $cl = SETCCr 13, implicit $eflags466 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $edi467 ; CHECK-NEXT: CMP64ri32 [[COPY1]], -1, implicit-def $eflags468 ; CHECK-NEXT: $cl = SETCCr 14, implicit $eflags469 %0:gr64 = COPY $rsi470 CMP64ri32 %0, 1, implicit-def $eflags471 ; TEST should be removed472 TEST64rr %0, %0, implicit-def $eflags473 $cl = SETCCr 15, implicit $eflags474 475 %1:gr64 = COPY $edi476 CMP64ri32 %1, -1, implicit-def $eflags477 ; TEST should be removed478 TEST64rr %1, %1, implicit-def $eflags479 $cl = SETCCr 12, implicit $eflags480...481---482name: opt_redundant_flags_adjusted_imm_noopt_0483body: |484 bb.0:485 ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_noopt_0486 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi487 ; CHECK-NEXT: CMP64ri32 [[COPY]], 42, implicit-def $eflags488 ; CHECK-NEXT: $cl = SETCCr 4, implicit $eflags489 ; CHECK-NEXT: CMP64ri32 [[COPY]], 41, implicit-def $eflags490 ; CHECK-NEXT: $bl = SETCCr 4, implicit $eflags491 %0:gr64 = COPY $rsi492 ; CMP+SETCC %0 <s 1493 CMP64ri32 %0, 42, implicit-def $eflags494 $cl = SETCCr 4, implicit $eflags495 ; CMP should not be removed.496 CMP64ri32 %0, 41, implicit-def $eflags497 ; %0 == 41498 $bl = SETCCr 4, implicit $eflags499...500---501name: opt_redundant_flags_adjusted_imm_noopt_1502body: |503 bb.0:504 ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_noopt_1505 ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi506 ; CHECK-NEXT: CMP32ri [[COPY]], 2147483647, implicit-def $eflags507 ; CHECK-NEXT: CMP32ri [[COPY]], -2147483648, implicit-def $eflags508 ; CHECK-NEXT: $bl = SETCCr 12, implicit $eflags509 ; CHECK-NEXT: CMP32ri [[COPY]], 4294967295, implicit-def $eflags510 ; CHECK-NEXT: CMP32ri [[COPY]], -2147483648, implicit-def $eflags511 ; CHECK-NEXT: $bl = SETCCr 12, implicit $eflags512 ; CHECK-NEXT: CMP32ri [[COPY]], 2147483647, implicit-def $eflags513 ; CHECK-NEXT: CMP32ri [[COPY]], -2147483648, implicit-def $eflags514 ; CHECK-NEXT: $bl = SETCCr 13, implicit $eflags515 ; CHECK-NEXT: CMP32ri [[COPY]], 4294967295, implicit-def $eflags516 ; CHECK-NEXT: CMP32ri [[COPY]], 0, implicit-def $eflags517 ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags518 ; CHECK-NEXT: CMP32ri [[COPY]], 4294967295, implicit-def $eflags519 ; CHECK-NEXT: CMP32ri [[COPY]], 0, implicit-def $eflags520 ; CHECK-NEXT: $bl = SETCCr 3, implicit $eflags521 %0:gr32 = COPY $esi522 ; CMP+SETCC %0 == INT32_MAX523 CMP32ri %0, 2147483647, implicit-def $eflags524 ; CMP should not be removed.525 CMP32ri %0, -2147483648, implicit-def $eflags526 ; %0 <s INT32_MIN527 $bl = SETCCr 12, implicit $eflags528 529 CMP32ri %0, 4294967295, implicit-def $eflags530 ; CMP should not be removed.531 CMP32ri %0, -2147483648, implicit-def $eflags532 $bl = SETCCr 12, implicit $eflags533 534 CMP32ri %0, 2147483647, implicit-def $eflags535 ; CMP should not be removed.536 CMP32ri %0, -2147483648, implicit-def $eflags537 $bl = SETCCr 13, implicit $eflags538 539 CMP32ri %0, 4294967295, implicit-def $eflags540 ; should not be removed541 CMP32ri %0, 0, implicit-def $eflags542 $bl = SETCCr 2, implicit $eflags543 544 CMP32ri %0, 4294967295, implicit-def $eflags545 ; should not be removed546 CMP32ri %0, 0, implicit-def $eflags547 $bl = SETCCr 3, implicit $eflags548...549---550name: opt_redundant_flags_adjusted_imm_noopt_2551body: |552 bb.0:553 ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_noopt_2554 ; CHECK: [[COPY:%[0-9]+]]:gr16 = COPY $cx555 ; CHECK-NEXT: CMP16ri [[COPY]], -32768, implicit-def $eflags556 ; CHECK-NEXT: CMP16ri [[COPY]], 32767, implicit-def $eflags557 ; CHECK-NEXT: $bl = SETCCr 15, implicit $eflags558 ; CHECK-NEXT: CMP16ri [[COPY]], 65535, implicit-def $eflags559 ; CHECK-NEXT: CMP16ri [[COPY]], 32767, implicit-def $eflags560 ; CHECK-NEXT: $bl = SETCCr 15, implicit $eflags561 ; CHECK-NEXT: CMP16ri [[COPY]], -32768, implicit-def $eflags562 ; CHECK-NEXT: CMP16ri [[COPY]], 32767, implicit-def $eflags563 ; CHECK-NEXT: $bl = SETCCr 14, implicit $eflags564 ; CHECK-NEXT: CMP16ri [[COPY]], 0, implicit-def $eflags565 ; CHECK-NEXT: CMP16ri [[COPY]], 65535, implicit-def $eflags566 ; CHECK-NEXT: $bl = SETCCr 4, implicit $eflags567 ; CHECK-NEXT: CMP16ri [[COPY]], 0, implicit-def $eflags568 ; CHECK-NEXT: CMP16ri [[COPY]], 65535, implicit-def $eflags569 ; CHECK-NEXT: $bl = SETCCr 6, implicit $eflags570 %0:gr16 = COPY $cx571 ; CMP+SETCC %0 == INT16_MIN572 CMP16ri %0, -32768, implicit-def $eflags573 ; CMP should not be removed.574 CMP16ri %0, 32767, implicit-def $eflags575 ; %0 >s INT16_MAX576 $bl = SETCCr 15, implicit $eflags577 578 CMP16ri %0, 65535, implicit-def $eflags579 ; CMP should not be removed.580 CMP16ri %0, 32767, implicit-def $eflags581 $bl = SETCCr 15, implicit $eflags582 583 CMP16ri %0, -32768, implicit-def $eflags584 ; CMP should not be removed.585 CMP16ri %0, 32767, implicit-def $eflags586 $bl = SETCCr 14, implicit $eflags587 588 CMP16ri %0, 0, implicit-def $eflags589 ; should not be removed590 CMP16ri %0, 65535, implicit-def $eflags591 $bl = SETCCr 4, implicit $eflags592 593 CMP16ri %0, 0, implicit-def $eflags594 ; should not be removed595 CMP16ri %0, 65535, implicit-def $eflags596 $bl = SETCCr 6, implicit $eflags597...598---599name: opt_adjusted_imm_multiple_blocks600body: |601 ; CHECK-LABEL: name: opt_adjusted_imm_multiple_blocks602 ; CHECK: bb.0:603 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.3(0x40000000)604 ; CHECK-NEXT: {{ $}}605 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $eax606 ; CHECK-NEXT: CMP32ri [[COPY]], 20, implicit-def $eflags607 ; CHECK-NEXT: JCC_1 %bb.1, 4, implicit $eflags608 ; CHECK-NEXT: JMP_1 %bb.3609 ; CHECK-NEXT: {{ $}}610 ; CHECK-NEXT: bb.1:611 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)612 ; CHECK-NEXT: liveins: $eflags613 ; CHECK-NEXT: {{ $}}614 ; CHECK-NEXT: JCC_1 %bb.2, 15, implicit $eflags615 ; CHECK-NEXT: JMP_1 %bb.3616 ; CHECK-NEXT: {{ $}}617 ; CHECK-NEXT: bb.2:618 ; CHECK-NEXT: successors: %bb.3(0x80000000)619 ; CHECK-NEXT: {{ $}}620 ; CHECK-NEXT: JMP_1 %bb.3621 ; CHECK-NEXT: {{ $}}622 ; CHECK-NEXT: bb.3:623 ; CHECK-NEXT: RET 0624 bb.0:625 %0:gr32 = COPY $eax626 CMP32ri %0, 20, implicit-def $eflags627 JCC_1 %bb.1, 4, implicit $eflags628 JMP_1 %bb.3629 630 bb.1:631 ; CMP can be removed when adjusting the JCC.632 CMP32ri %0, 21, implicit-def $eflags633 JCC_1 %bb.2, 13, implicit $eflags634 JMP_1 %bb.3635 636 bb.2:637 JMP_1 %bb.3638 639 bb.3:640 RET 0641...642---643name: opt_adjusted_imm_multiple_blocks_noopt644body: |645 ; CHECK-LABEL: name: opt_adjusted_imm_multiple_blocks_noopt646 ; CHECK: bb.0:647 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.3(0x40000000)648 ; CHECK-NEXT: {{ $}}649 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $eax650 ; CHECK-NEXT: CMP32ri [[COPY]], 20, implicit-def $eflags651 ; CHECK-NEXT: JCC_1 %bb.1, 4, implicit $eflags652 ; CHECK-NEXT: JMP_1 %bb.3653 ; CHECK-NEXT: {{ $}}654 ; CHECK-NEXT: bb.1:655 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)656 ; CHECK-NEXT: {{ $}}657 ; CHECK-NEXT: CMP32ri [[COPY]], 21, implicit-def $eflags658 ; CHECK-NEXT: JCC_1 %bb.2, 13, implicit $eflags659 ; CHECK-NEXT: JMP_1 %bb.3660 ; CHECK-NEXT: {{ $}}661 ; CHECK-NEXT: bb.2:662 ; CHECK-NEXT: successors: %bb.3(0x80000000)663 ; CHECK-NEXT: liveins: $eflags664 ; CHECK-NEXT: {{ $}}665 ; CHECK-NEXT: $al = SETCCr 4, implicit $eflags666 ; CHECK-NEXT: {{ $}}667 ; CHECK-NEXT: bb.3:668 ; CHECK-NEXT: RET 0669 bb.0:670 %0:gr32 = COPY $eax671 CMP32ri %0, 20, implicit-def $eflags672 JCC_1 %bb.1, 4, implicit $eflags673 JMP_1 %bb.3674 675 bb.1:676 ; The following CMP should not be optimized because $eflags is live-out677 CMP32ri %0, 21, implicit-def $eflags678 JCC_1 %bb.2, 13, implicit $eflags679 JMP_1 %bb.3680 681 bb.2:682 liveins: $eflags683 $al = SETCCr 4, implicit $eflags684 685 bb.3:686 RET 0687...688---689name: opt_shift_cmp_zero690body: |691 bb.0:692 ; CHECK-LABEL: name: opt_shift_cmp_zero693 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi694 ; CHECK-NEXT: [[SHL64ri:%[0-9]+]]:gr64 = SHL64ri [[COPY]], 7, implicit-def $eflags695 ; CHECK-NEXT: $al = SETCCr 4, implicit $eflags696 %0:gr64 = COPY $rsi697 %1:gr64 = SHL64ri %0, 7, implicit-def dead $eflags698 ; TEST should be removed.699 TEST64rr %1, %1, implicit-def $eflags700 $al = SETCCr 4, implicit $eflags701...702---703name: noopt_shift_cmp_zero704body: |705 bb.0:706 ; CHECK-LABEL: name: noopt_shift_cmp_zero707 ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi708 ; CHECK-NEXT: [[SHL64ri:%[0-9]+]]:gr64 = SHL64ri [[COPY]], 9, implicit-def dead $eflags709 ; CHECK-NEXT: TEST64rr [[SHL64ri]], [[SHL64ri]], implicit-def $eflags710 ; CHECK-NEXT: $al = SETCCr 14, implicit $eflags711 %0:gr64 = COPY $rsi712 %1:gr64 = SHL64ri %0, 9, implicit-def dead $eflags713 ; TEST cannot be removed if a user relies on the OF flag.714 TEST64rr %1, %1, implicit-def $eflags715 $al = SETCCr 14, implicit $eflags716...717---718name: noopt_shift_cmp_zero_multiblock719body: |720 ; CHECK-LABEL: name: noopt_shift_cmp_zero_multiblock721 ; CHECK: bb.0:722 ; CHECK-NEXT: successors: %bb.1(0x80000000)723 ; CHECK-NEXT: {{ $}}724 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rsi725 ; CHECK-NEXT: [[SHL64ri:%[0-9]+]]:gr64 = SHL64ri [[COPY]], 9, implicit-def dead $eflags726 ; CHECK-NEXT: TEST64rr [[SHL64ri]], [[SHL64ri]], implicit-def $eflags727 ; CHECK-NEXT: JMP_1 %bb.1728 ; CHECK-NEXT: {{ $}}729 ; CHECK-NEXT: bb.1:730 ; CHECK-NEXT: liveins: $eflags731 ; CHECK-NEXT: {{ $}}732 ; CHECK-NEXT: $al = SETCCr 14, implicit $eflags733 bb.0:734 %0:gr64 = COPY $rsi735 %1:gr64 = SHL64ri %0, 9, implicit-def dead $eflags736 ; TEST cannot be removed if a user relies on the OF flag.737 TEST64rr %1, %1, implicit-def $eflags738 JMP_1 %bb.1739 740 bb.1:741 liveins: $eflags742 $al = SETCCr 14, implicit $eflags743...744