blob: c4aa64a257573e22f6f0f2111b79d8000c836575 [file] [edit]
; 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
}