mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[ARM GlobalISel] Fix selecting G_BRCOND
When lowering a G_BRCOND, we generate a TSTri of the condition against 1, which sets the flags, and then a Bcc which branches based on the value of the flags. Unfortunately, we were using the wrong condition code to check whether we need to branch (EQ instead of NE), which caused all our branches to do the opposite of what they were intended to do. This patch fixes the issue by using the correct condition code. llvm-svn: 319313
This commit is contained in:
parent
3df6922e61
commit
ded22a182d
@ -855,7 +855,7 @@ bool ARMInstructionSelector::select(MachineInstr &I,
|
||||
// Branch conditionally.
|
||||
auto Branch = BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(ARM::Bcc))
|
||||
.add(I.getOperand(1))
|
||||
.add(predOps(ARMCC::EQ, ARM::CPSR));
|
||||
.add(predOps(ARMCC::NE, ARM::CPSR));
|
||||
if (!constrainSelectedInstRegOperands(*Branch, TII, TRI, RBI))
|
||||
return false;
|
||||
I.eraseFromParent();
|
||||
|
@ -1171,7 +1171,7 @@ body: |
|
||||
|
||||
G_BRCOND %1(s1), %bb.1
|
||||
; CHECK: TSTri [[COND]], 1, 14, _, implicit-def %cpsr
|
||||
; CHECK: Bcc %bb.1, 0, %cpsr
|
||||
; CHECK: Bcc %bb.1, 1, %cpsr
|
||||
G_BR %bb.2
|
||||
; CHECK: B %bb.2
|
||||
|
||||
|
@ -442,7 +442,7 @@ define arm_aapcscc void @test_brcond(i32 %n) {
|
||||
; CHECK: cmp r0
|
||||
; CHECK-NEXT: movgt [[RCMP:r[0-9]+]], #1
|
||||
; CHECK: tst [[RCMP]], #1
|
||||
; CHECK-NEXT: bne [[FALSE:.L[[:alnum:]_]+]]
|
||||
; CHECK-NEXT: beq [[FALSE:.L[[:alnum:]_]+]]
|
||||
; CHECK: bl brcond1
|
||||
; CHECK: [[FALSE]]:
|
||||
; CHECK: bl brcond2
|
||||
|
Loading…
Reference in New Issue
Block a user