[llvm-bugs] [Bug 44951] New: SLH assertion error: Should never have a PHI in the initial checking block as it always has a single predecessor!

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Feb 18 09:31:38 PST 2020


https://bugs.llvm.org/show_bug.cgi?id=44951

            Bug ID: 44951
           Summary: SLH assertion error: Should never have a PHI in the
                    initial checking block as it always has a single
                    predecessor!
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Backend: X86
          Assignee: unassignedbugs at nondot.org
          Reporter: rupprecht at google.com
                CC: craig.topper at gmail.com, llvm-bugs at lists.llvm.org,
                    llvm-dev at redking.me.uk, spatel+llvm at rotateright.com

Created attachment 23138
  --> https://bugs.llvm.org/attachment.cgi?id=23138&action=edit
reproducer

IR reproducer (original input is a crash w/ -mspeculative-load-hardening
-fexperimental-new-pass-manager -O3):

$ cat repro.ll  # Also attached to the bug
; ModuleID = 'repro.ll'
source_filename = "repro.cc"
target datalayout =
"e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@y = external dso_local global i8, align 1
@ap = external dso_local local_unnamed_addr global i32, align 4

; Function Attrs: speculative_load_hardening
define dso_local void @f1() local_unnamed_addr #0 {
entry:
  %0 = load i32, i32* @ap, align 4
  switch i32 %0, label %sw.epilog [
    i32 0, label %sw.bb
    i32 1, label %sw.bb1
    i32 2, label %sw.bb4
    i32 3, label %sw.bb7
  ]

sw.bb:                                            ; preds = %entry
  call void @f2(i8* nonnull undef, i8* null)
  unreachable

sw.bb1:                                           ; preds = %entry
  call void @f2(i8* nonnull undef, i8* null)
  unreachable

sw.bb4:                                           ; preds = %entry
  call void @f2(i8* nonnull undef, i8* nonnull @y)
  br label %sw.bb7

sw.bb7:                                           ; preds = %sw.bb4, %entry
  ret void

sw.epilog:                                        ; preds = %entry
  unreachable
}

; Function Attrs: speculative_load_hardening
declare dso_local void @f2(i8*, i8*) unnamed_addr #0

; Function Attrs: speculative_load_hardening
define dso_local void @f3() local_unnamed_addr #0 {
for.body.lr.ph:
  %call4 = call { i8*, i32 } @f4(i8* nonnull undef)
  %0 = extractvalue { i8*, i32 } %call4, 0
  %tobool.i.i = icmp eq i8* %0, null
  br i1 %tobool.i.i, label %for.cond.cleanup9, label %for.body10.outer

for.body10.outer:                                 ; preds = %if.then.i,
%for.body.lr.ph
  %ph = phi i8* [ %add.ptr.i, %if.then.i ], [ undef, %for.body.lr.ph ]
  br label %for.body10

for.cond.cleanup9:                                ; preds = %for.body.lr.ph
  %call = call zeroext i1 @f6(i8* nonnull undef)
  unreachable

for.body10:                                       ; preds = %for.body10,
%for.body10.outer
  call void @f1()
  %call.i = call zeroext i1 @f7()
  br i1 %call.i, label %if.then.i, label %for.body10

if.then.i:                                        ; preds = %for.body10
  call void @f2(i8* nonnull undef, i8* %ph)
  %add.ptr.i = getelementptr inbounds i8, i8* %ph, i64 undef
  br label %for.body10.outer
}

; Function Attrs: speculative_load_hardening
declare dso_local i1 @f6(i8*) local_unnamed_addr #0

; Function Attrs: speculative_load_hardening
declare dso_local { i8*, i32 } @f4(i8*) local_unnamed_addr #0

; Function Attrs: speculative_load_hardening
declare dso_local i1 @f7() local_unnamed_addr #0

attributes #0 = { speculative_load_hardening }

$ clang++ -O3 -fexperimental-new-pass-manager -c repro.ll
clang++: llvm-project/llvm/lib/Target/X86/X86SpeculativeLoadHardening.cpp:743:
auto (anonymous
namespace)::X86SpeculativeLoadHardeningPass::tracePredStateThroughCFG(llvm::MachineFunction
&, ArrayRef<(anonymous
namespace)::X86SpeculativeLoadHardeningPass::BlockCondInfo>)::(anonymous
class)::operator()(llvm::MachineBasicBlock &, llvm::MachineBasicBlock &, int,
llvm::MachineInstr *, llvm::MachineInstr *&, ArrayRef<X86::CondCode>) const:
Assertion `(InsertPt == CheckingMBB.end() || !InsertPt->isPHI()) && "Should
never have a PHI in the initial checking block as it " "always has a single
predecessor!"' failed.
Stack dump:
0.      Program arguments: clang++ -O3 -fexperimental-new-pass-manager -c
repro.ll 
1.      Code generation
2.      Running pass 'Function Pass Manager' on module 'repro.ll'.
3.      Running pass 'X86 speculative load hardening' on function '@f3'
 #0 0x0000000007f89b17 llvm::sys::PrintStackTrace(llvm::raw_ostream&)
llvm-project/llvm/lib/Support/Unix/Signals.inc:564:11
<...stack unwinder...>
#11 0x00000000068c3f43 (anonymous
namespace)::X86SpeculativeLoadHardeningPass::tracePredStateThroughCFG(llvm::MachineFunction&,
llvm::ArrayRef<(anonymous
namespace)::X86SpeculativeLoadHardeningPass::BlockCondInfo>)::$_5::operator()(llvm::MachineBasicBlock&,
llvm::MachineBasicBlock&, int, llvm::MachineInstr*, llvm::MachineInstr*&,
llvm::ArrayRef<llvm::X86::CondCode>) const
llvm-project/llvm/lib/Target/X86/X86SpeculativeLoadHardening.cpp:0:11
#12 0x00000000068c063d (anonymous
namespace)::X86SpeculativeLoadHardeningPass::tracePredStateThroughCFG(llvm::MachineFunction&,
llvm::ArrayRef<(anonymous
namespace)::X86SpeculativeLoadHardeningPass::BlockCondInfo>)
llvm-project/llvm/lib/Target/X86/X86SpeculativeLoadHardening.cpp:800:9
#13 0x00000000068bed7d (anonymous
namespace)::X86SpeculativeLoadHardeningPass::runOnMachineFunction(llvm::MachineFunction&)
llvm-project/llvm/lib/Target/X86/X86SpeculativeLoadHardening.cpp:507:16
#14 0x0000000006f546d7
llvm::MachineFunctionPass::runOnFunction(llvm::Function&)
llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:73:8
#15 0x0000000007487dcc llvm::FPPassManager::runOnFunction(llvm::Function&)
llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1482:23
#16 0x00000000074881f5 llvm::FPPassManager::runOnModule(llvm::Module&)
llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1518:16
#17 0x0000000007488974 (anonymous
namespace)::MPPassManager::runOnModule(llvm::Module&)
llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1583:23
#18 0x0000000007488498 llvm::legacy::PassManagerImpl::run(llvm::Module&)
llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1695:16
#19 0x0000000007488f11 llvm::legacy::PassManager::run(llvm::Module&)
llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1726:3
#20 0x00000000082eb24d (anonymous
namespace)::EmitAssemblyHelper::EmitAssemblyWithNewPassManager(clang::BackendAction,
std::unique_ptr<llvm::raw_pwrite_stream,
std::default_delete<llvm::raw_pwrite_stream> >)
llvm-project/clang/lib/CodeGen/BackendUtil.cpp:1362:3
#21 0x00000000082e7f3d clang::EmitBackendOutput(clang::DiagnosticsEngine&,
clang::HeaderSearchOptions const&, clang::CodeGenOptions const&,
clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout
const&, llvm::Module*, clang::BackendAction,
std::unique_ptr<llvm::raw_pwrite_stream,
std::default_delete<llvm::raw_pwrite_stream> >)
llvm-project/clang/lib/CodeGen/BackendUtil.cpp:1580:5

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200218/1cee5fac/attachment-0001.html>


More information about the llvm-bugs mailing list