<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><div style="direction: ltr;">The patch LGTM. </div><div style="direction: ltr;"><br></div><div style="direction: ltr;">Can you please move the comment above the line? I think it would make the code easier to follow. </div></div><div><br><div><br><br></div>On Feb 23, 2016, at 06:27, Amjad Aboud <<a href="mailto:amjad.aboud@intel.com">amjad.aboud@intel.com</a>> wrote:<br><br></div><blockquote type="cite"><div><span>aaboud created this revision.</span><br><span>aaboud added reviewers: DavidKreitzer, hjl.tools, nadav.</span><br><span>aaboud added a subscriber: llvm-commits.</span><br><span></span><br><span>Resolved Bug 26412.</span><br><span><a href="https://llvm.org/bugs/show_bug.cgi?id=26412">https://llvm.org/bugs/show_bug.cgi?id=26412</a></span><br><span></span><br><span></span><br><span><a href="http://reviews.llvm.org/D17542">http://reviews.llvm.org/D17542</a></span><br><span></span><br><span>Files:</span><br><span>  lib/Target/X86/X86VZeroUpper.cpp</span><br><span>  test/CodeGen/X86/x86-interrupt_vzeroupper.ll</span><br><span></span><br><span>Index: lib/Target/X86/X86VZeroUpper.cpp</span><br><span>===================================================================</span><br><span>--- lib/Target/X86/X86VZeroUpper.cpp</span><br><span>+++ lib/Target/X86/X86VZeroUpper.cpp</span><br><span>@@ -80,6 +80,7 @@</span><br><span>     BlockStateMap BlockStates;</span><br><span>     DirtySuccessorsWorkList DirtySuccessors;</span><br><span>     bool EverMadeChange;</span><br><span>+    bool IsX86INTR;</span><br><span>     const TargetInstrInfo *TII;</span><br><span></span><br><span>     static char ID;</span><br><span>@@ -181,7 +182,11 @@</span><br><span></span><br><span>   for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ++I) {</span><br><span>     MachineInstr *MI = I;</span><br><span>-    bool isControlFlow = MI->isCall() || MI->isReturn();</span><br><span>+    bool isControlFlow = MI->isCall() ||</span><br><span>+                         // No need for vzeroupper before iret in interrupt</span><br><span>+                         // handler function, epilogue will restore YMM</span><br><span>+                         // registers if needed.</span><br><span>+                         (MI->isReturn() && !IsX86INTR);</span><br><span></span><br><span>     // Shortcut: don't need to check regular instructions in dirty state.</span><br><span>     if (!isControlFlow && CurState == EXITS_DIRTY)</span><br><span>@@ -253,6 +258,7 @@</span><br><span>   TII = ST.getInstrInfo();</span><br><span>   MachineRegisterInfo &MRI = MF.getRegInfo();</span><br><span>   EverMadeChange = false;</span><br><span>+  IsX86INTR = MF.getFunction()->getCallingConv() == CallingConv::X86_INTR;</span><br><span></span><br><span>   bool FnHasLiveInYmm = checkFnHasLiveInYmm(MRI);</span><br><span></span><br><span>Index: test/CodeGen/X86/x86-interrupt_vzeroupper.ll</span><br><span>===================================================================</span><br><span>--- test/CodeGen/X86/x86-interrupt_vzeroupper.ll</span><br><span>+++ test/CodeGen/X86/x86-interrupt_vzeroupper.ll</span><br><span>@@ -0,0 +1,41 @@</span><br><span>+; RUN: llc -mtriple=x86_64-unknown-unknown < %s | FileCheck %s</span><br><span>+</span><br><span>+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span><br><span>+;; Checks that interrupt handler code does not call "vzeroupper" instruction</span><br><span>+;; before iret.</span><br><span>+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span><br><span>+;; Command line: -Wall -march=nehalem -S -o - -emit-llvm -O2</span><br><span>+;; Source:</span><br><span>+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span><br><span>+;;extern void foo (void *) __attribute__ ((interrupt));</span><br><span>+;;extern void bar (void);</span><br><span>+;;</span><br><span>+;;void foo (void *frame)</span><br><span>+;;{</span><br><span>+;;  bar ();</span><br><span>+;;}</span><br><span>+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span><br><span>+</span><br><span>+; CHECK: vzeroupper</span><br><span>+; CHECK-NEXT: call</span><br><span>+; CHECK-NOT: vzeroupper</span><br><span>+; CHECK: iret</span><br><span>+</span><br><span>+@llvm.used = appending global [1 x i8*] [i8* bitcast (void (i8*)* @foo to i8*)], section "llvm.metadata"</span><br><span>+</span><br><span>+; Function Attrs: nounwind uwtable</span><br><span>+define x86_intrcc void @foo(i8* nocapture readnone %frame) #0 {</span><br><span>+entry:</span><br><span>+  tail call void @bar() #2</span><br><span>+  ret void</span><br><span>+}</span><br><span>+</span><br><span>+declare void @bar() #1</span><br><span>+</span><br><span>+attributes #0 = { nounwind uwtable "disable-tail-calls"="true" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "stackrealign" "target-cpu"="nehalem" "target-features"="+avx,+cx16,+fxsr,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+xsave,-3dnow,-3dnowa,-mmx" "unsafe-fp-math"="false" "use-soft-float"="true" }</span><br><span>+attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="nehalem" "target-features"="+avx,+cx16,+fxsr,+mmx,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+xsave" "unsafe-fp-math"="false" "use-soft-float"="false" }</span><br><span>+attributes #2 = { nounwind }</span><br><span>+</span><br><span>+!llvm.ident = !{!0}</span><br><span>+</span><br><span>+!0 = !{!"clang version 3.9.0 (trunk 259349) (llvm/trunk 259357)"}</span><br><span></span><br><span></span><br></div></blockquote><blockquote type="cite"><div><D17542.48814.patch></div></blockquote></body></html>