| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=m68k-linux -verify-machineinstrs | FileCheck %s |
| |
| ; The purpose of this test is to ensure that %cmp2 doesn't emit a redundant |
| ; compare instruction; it should be eliminated by CSE. |
| define i1 @cse(ptr %y) nounwind { |
| ; CHECK-LABEL: cse: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: move.l (4,%sp), %a0 |
| ; CHECK-NEXT: move.w (%a0), %d0 |
| ; CHECK-NEXT: cmpi.w #0, %d0 |
| ; CHECK-NEXT: bmi .LBB0_2 |
| ; CHECK-NEXT: ; %bb.1: ; %cmp2 |
| ; CHECK-NEXT: beq .LBB0_3 |
| ; CHECK-NEXT: .LBB0_2: ; %yes |
| ; CHECK-NEXT: moveq #1, %d0 |
| ; CHECK-NEXT: rts |
| ; CHECK-NEXT: .LBB0_3: ; %no |
| ; CHECK-NEXT: clr.b %d0 |
| ; CHECK-NEXT: rts |
| %1 = load i16, ptr %y |
| %2 = icmp slt i16 %1, 0 |
| br i1 %2, label %yes, label %cmp2 |
| |
| cmp2: |
| %.not = icmp eq i16 %1, 0 |
| br i1 %.not, label %no, label %yes |
| |
| yes: |
| ret i1 1 |
| |
| no: |
| ret i1 0 |
| } |
| |
| ; The compare condition is different and therefore not eliminated by CSE. |
| define i1 @no_cse(ptr %y) nounwind { |
| ; CHECK-LABEL: no_cse: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: move.l (4,%sp), %a0 |
| ; CHECK-NEXT: move.w (%a0), %d0 |
| ; CHECK-NEXT: cmpi.w #0, %d0 |
| ; CHECK-NEXT: bmi .LBB1_2 |
| ; CHECK-NEXT: ; %bb.1: ; %cmp2 |
| ; CHECK-NEXT: cmpi.w #10, %d0 |
| ; CHECK-NEXT: bne .LBB1_2 |
| ; CHECK-NEXT: ; %bb.3: ; %no |
| ; CHECK-NEXT: clr.b %d0 |
| ; CHECK-NEXT: rts |
| ; CHECK-NEXT: .LBB1_2: ; %yes |
| ; CHECK-NEXT: moveq #1, %d0 |
| ; CHECK-NEXT: rts |
| %1 = load i16, ptr %y |
| %2 = icmp slt i16 %1, 0 |
| br i1 %2, label %yes, label %cmp2 |
| |
| cmp2: |
| %.not = icmp eq i16 %1, 10 |
| br i1 %.not, label %no, label %yes |
| |
| yes: |
| ret i1 1 |
| |
| no: |
| ret i1 0 |
| } |