1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00
llvm-mirror/test/CodeGen/Thumb2/ifcvt-rescan-diamonds.ll
Tim Northover 932ea08fcd ARM: make Thumb1 instructions non-flag-setting in IT block.
Many Thumb1 instructions are defined to set CPSR if executed outside an IT
block, but leave it alone from inside one. In MachineIR this is represented by
whether an optional register is CPSR or NoReg (0), and affects how the
instructions are printed.

This sets the instruction to the appropriate form during if-conversion.
2020-07-28 13:31:17 +01:00

68 lines
2.4 KiB
LLVM

; RUN: llc -O2 -o - %s | FileCheck %s
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "thumbv8-unknown-linux-gnueabihf"
; This is a tricky test case.
; The point of it is to create a diamond where both the true block and the
; false block clobber the predicate when viewed as a whole, but only one of them
; clobbers the predicate when considering the instructions they share.
; Function Attrs: nounwind
define void @BN_kronecker(i1 %a, i32 %b) #0 {
entry:
br label %while.cond38
while.cond38: ; preds = %if.end111, %entry
%cmp79 = icmp eq i32 0, 0
br i1 %a, label %cond.true77, label %cond.false87
; CHECK: %cond.true77
; CHECK-NEXT: @ in Loop
; CHECK-NEXT: cmp.w {{r[0-9]+}}, #0
; CHECK-NEXT: it eq
; CHECK-NEXT: ldreq
; CHECK-NEXT: it ne
; N.b. 16-bit mov instruction in IT block does not set flags.
; CHECK-NEXT: movne
; CHECK-NEXT: mvns
; CHECK-NEXT: b
cond.true77: ; preds = %while.cond38
br i1 %cmp79, label %cond.end84, label %cond.false81
cond.false81: ; preds = %cond.true77
%0 = load i32, i32* null, align 4
br label %cond.end84
cond.end84: ; preds = %cond.false81, %cond.true77
%cond85 = phi i32 [ %0, %cond.false81 ], [ 0, %cond.true77 ]
%neg86 = xor i32 %cond85, -1
br label %cond.false101
cond.false87: ; preds = %while.cond38
br i1 %cmp79, label %cond.false101, label %cond.false91
cond.false91: ; preds = %cond.false87
br label %cond.false101
cond.false101: ; preds = %cond.false91, %cond.false87, %cond.end84
%cond97 = phi i32 [ %neg86, %cond.end84 ], [ %b, %cond.false91 ], [ 0, %cond.false87 ]
%1 = load i32, i32* null, align 4
%and106 = and i32 %cond97, %1
%and107 = and i32 %and106, 2
%tobool108 = icmp ne i32 %and107, 0
br i1 %tobool108, label %if.then109, label %if.end111
if.then109: ; preds = %cond.false101
store i32 0, i32* undef, align 4
br label %if.end111
if.end111: ; preds = %if.then109, %cond.false101
%tobool113 = icmp ne i32 0, 0
br i1 %tobool113, label %while.cond38, label %end
end: ; preds = %if.end111
ret void
}
attributes #0 = { nounwind }