From: Joseph Tremoulet <jotrem@microsoft.com>
Date: Sat, 17 Oct 2015 00:08:08 +0000 (+0000)
Subject: [WinEH] Fix eh.exceptionpointer intrinsic lowering
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c453b3420c1e74d3f4435e70bffb4d8ae9dcd6ec;p=oota-llvm.git

[WinEH] Fix eh.exceptionpointer intrinsic lowering

Summary:
Some shared code for handling eh.exceptionpointer and eh.exceptioncode
needs to not share the part that truncates to 32 bits, which is intended
just for exception codes.

Reviewers: rnk

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D13747

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250588 91177308-0d34-0410-b5e6-96231b3b80d8
---

diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 3f061f3150d..cd4ef362d47 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -5258,7 +5258,8 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
     unsigned VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
     SDValue N =
         DAG.getCopyFromReg(DAG.getEntryNode(), getCurSDLoc(), VReg, PtrVT);
-    N = DAG.getZExtOrTrunc(N, getCurSDLoc(), MVT::i32);
+    if (Intrinsic == Intrinsic::eh_exceptioncode)
+      N = DAG.getZExtOrTrunc(N, getCurSDLoc(), MVT::i32);
     setValue(&I, N);
     return nullptr;
   }
diff --git a/test/CodeGen/WinEH/wineh-exceptionpointer.ll b/test/CodeGen/WinEH/wineh-exceptionpointer.ll
new file mode 100644
index 00000000000..05139ef1bd9
--- /dev/null
+++ b/test/CodeGen/WinEH/wineh-exceptionpointer.ll
@@ -0,0 +1,28 @@
+; RUN: llc -mtriple=x86_64-pc-windows-coreclr < %s | FileCheck %s
+
+declare void @ProcessCLRException()
+declare i8 addrspace(1)* @llvm.eh.exceptionpointer.p1i8(token)
+declare void @f()
+declare void @g(i32 addrspace(1)*)
+
+; CHECK-LABEL: test1: # @test1
+define void @test1() personality i8* bitcast (void ()* @ProcessCLRException to i8*) {
+entry:
+  invoke void @f()
+    to label %exit unwind label %catch.pad
+catch.pad:
+; CHECK: {{^[^: ]+}}: # %catch.pad
+  %catch = catchpad [i32 5]
+    to label %catch.body unwind label %catch.end
+catch.body:
+  %exn = call i8 addrspace(1)* @llvm.eh.exceptionpointer.p1i8(token %catch)
+  %cast_exn = bitcast i8 addrspace(1)* %exn to i32 addrspace(1)*
+  ; CHECK: movq %rax, %rcx
+  ; CHECK-NEXT: callq g
+  call void @g(i32 addrspace(1)* %cast_exn)
+  catchret %catch to label %exit
+catch.end:
+  catchendpad unwind to caller
+exit:
+  ret void
+}