From 893df2032d480bf791a69fe965c3ca4ef500145b Mon Sep 17 00:00:00 2001 From: Mikael Holmen Date: Wed, 8 Apr 2020 11:58:26 +0200 Subject: [PATCH] [IfConversion] Disallow TrueBB == FalseBB for valid diamonds Summary: This fixes PR45302. Previously the case BB1 / \ | | TBB FBB | | \ / BB2 was treated as a valid diamond also when TBB and FBB was the same basic block. This then lead to a failed assertion in IfConvertDiamond. Since TBB == FBB is quite a degenerated case of a diamond, we now don't treat it as a valid diamond anymore, and thus we will avoid the trouble of making IfConvertDiamond handle it correctly. Reviewers: efriedma, kparzysz Reviewed By: efriedma Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D77651 --- llvm/lib/CodeGen/IfConversion.cpp | 5 +++ .../CodeGen/ARM/ifcvt_diamondSameTrueFalse.mir | 40 ++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 llvm/test/CodeGen/ARM/ifcvt_diamondSameTrueFalse.mir diff --git a/llvm/lib/CodeGen/IfConversion.cpp b/llvm/lib/CodeGen/IfConversion.cpp index 77fa128..90c471c 100644 --- a/llvm/lib/CodeGen/IfConversion.cpp +++ b/llvm/lib/CodeGen/IfConversion.cpp @@ -972,6 +972,11 @@ bool IfConverter::ValidDiamond( FalseBBI.IsBeingAnalyzed || FalseBBI.IsDone) return false; + // If the True and False BBs are equal we're dealing with a degenerate case + // that we don't treat as a diamond. + if (TrueBBI.BB == FalseBBI.BB) + return false; + MachineBasicBlock *TT = TrueBBI.TrueBB; MachineBasicBlock *FT = FalseBBI.TrueBB; diff --git a/llvm/test/CodeGen/ARM/ifcvt_diamondSameTrueFalse.mir b/llvm/test/CodeGen/ARM/ifcvt_diamondSameTrueFalse.mir new file mode 100644 index 0000000..66e4cd0 --- /dev/null +++ b/llvm/test/CodeGen/ARM/ifcvt_diamondSameTrueFalse.mir @@ -0,0 +1,40 @@ +# RUN: llc -mtriple=thumbv7-apple-ios -o - %s -run-pass if-converter -verify-machineinstrs | FileCheck %s + +# Don't treat bb.1 as a valid diamond since IfConverter::IfConvertDiamond can't +# handle it and used to hit an assertion instead. + +--- | + define void @func() minsize { + ret void + } +... +--- +name: func +body: | + bb.0: + + tBcc %bb.3, 1, $cpsr + + bb.1: + + tBcc %bb.2, 1, $cpsr + tB %bb.2, 14, $noreg + + bb.2: + + bb.3: + successors: + tBX_RET 14, _ +... + +# CHECK-LABEL: bb.0: +# CHECK: tBcc %bb.3, 1 + +# CHECK-LABEL: bb.1: +# CHECK: tBcc %bb.2, 1 +# CHECK-NEXT: tB %bb.2, 14 + +# CHECK-LABEL: bb.2: + +# CHECK-LABEL: bb.3: +# CHECK: tBX_RET 14 -- 2.7.4