From 543ae79447535954092b754be14f1a31f5503e14 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 9 Aug 2016 17:55:12 +0000 Subject: [PATCH] [X86] Don't model UD2/UD2B as a terminator A UD2 might make its way into the program via a call to @llvm.trap. Obviously, calls are not terminators. However, we modeled the X86 instruction, UD2, as a terminator. Later on, this confuses the epilogue insertion machinery which results in the epilogue getting inserted before the UD2. For some platforms, like x64, the result is a violation of the ABI. Instead, model UD2/UD2B as a side effecting instruction which may observe memory. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278144 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86InstrSystem.td | 2 +- test/CodeGen/X86/x86-framelowering-trap.ll | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/Target/X86/X86InstrSystem.td b/lib/Target/X86/X86InstrSystem.td index 6667bd2aec4..97dc2af2c6c 100644 --- a/lib/Target/X86/X86InstrSystem.td +++ b/lib/Target/X86/X86InstrSystem.td @@ -23,7 +23,7 @@ let Defs = [RAX, RCX, RDX] in // CPU flow control instructions -let isTerminator = 1, isBarrier = 1, hasCtrlDep = 1 in { +let mayLoad = 1, mayStore = 0, hasSideEffects = 1 in { def TRAP : I<0x0B, RawFrm, (outs), (ins), "ud2", [(trap)]>, TB; def UD2B : I<0xB9, RawFrm, (outs), (ins), "ud2b", []>, TB; } diff --git a/test/CodeGen/X86/x86-framelowering-trap.ll b/test/CodeGen/X86/x86-framelowering-trap.ll index 58a1da23a29..f1590abcae8 100644 --- a/test/CodeGen/X86/x86-framelowering-trap.ll +++ b/test/CodeGen/X86/x86-framelowering-trap.ll @@ -3,13 +3,18 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" ; CHECK-LABEL: bar: +; CHECK: pushq ; CHECK: ud2 +; CHECK-NEXT: popq ; CHECK-NEXT: retq define void @bar() { entry: + call void @callee() call void @llvm.trap() ret void } ; Function Attrs: noreturn nounwind declare void @llvm.trap() + +declare void @callee() -- 2.11.0