This reverts commit r323991. This commit breaks target that don't model all the register constraints in TableGen. So far the workaround was to set the hasExtraXXXRegAllocReq, but it proves that it doesn't cover all the cases. For instance, when mutating an instruction (like in the lowering of COPYs) the isRenamable flag is not properly updated. The same problem will happen when attaching machine operand from one instruction to another. Geoff Berry is working on a fix in https://reviews.llvm.org/D43042. llvm-svn: 325421
36 lines
937 B
LLVM
36 lines
937 B
LLVM
; RUN: llc -mtriple=aarch64-none-linux-gnu -aarch64-enable-atomic-cfg-tidy=0 -verify-machineinstrs -o - %s | FileCheck %s
|
|
|
|
; LLVM should be able to cope with multiple uses of the same flag-setting
|
|
; instruction at different points of a routine. Either by rematerializing the
|
|
; compare or by saving and restoring the flag register.
|
|
|
|
declare void @bar()
|
|
|
|
@var = global i32 0
|
|
|
|
define i32 @test_multiflag(i32 %n, i32 %m, i32 %o) {
|
|
; CHECK-LABEL: test_multiflag:
|
|
|
|
%test = icmp ne i32 %n, %m
|
|
; CHECK: cmp [[LHS:w[0-9]+]], [[RHS:w[0-9]+]]
|
|
|
|
%val = zext i1 %test to i32
|
|
; CHECK: cset {{[xw][0-9]+}}, ne
|
|
|
|
store i32 %val, i32* @var
|
|
|
|
call void @bar()
|
|
; CHECK: bl bar
|
|
|
|
; Currently, the comparison is emitted again. An MSR/MRS pair would also be
|
|
; acceptable, but assuming the call preserves NZCV is not.
|
|
br i1 %test, label %iftrue, label %iffalse
|
|
; CHECK: cmp [[LHS]], [[RHS]]
|
|
; CHECK: b.eq
|
|
|
|
iftrue:
|
|
ret i32 42
|
|
iffalse:
|
|
ret i32 0
|
|
}
|