| ; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s |
| |
| ; PR26575 |
| ; Assertion `(Disp->isImm() || Disp->isGlobal()) && (Other.Disp->isImm() || Other.Disp->isGlobal()) && "Address displacement operand is always an immediate or a global"' failed. |
| |
| target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" |
| target triple = "i686-pc-windows-msvc" |
| |
| declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i1) argmemonly nounwind |
| declare <2 x i64> @_mm_xor_si128(<2 x i64>, <2 x i64>) optsize |
| declare <2 x i64> @llvm.x86.pclmulqdq(<2 x i64>, <2 x i64>, i8) nounwind readnone |
| declare <4 x float> @_mm_castsi128_ps(<2 x i64>) optsize |
| |
| ; Check that the LEA optimization pass works with CPI address displacements. |
| define void @test1(i8* nocapture readonly %src, i32 %len) #0 { |
| %parts = alloca [4 x i32], align 4 |
| %part0 = bitcast [4 x i32]* %parts to i8* |
| call void @llvm.memcpy.p0i8.p0i8.i32(i8* %part0, i8* %src, i32 %len, i1 false) |
| %call0 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> undef, <2 x i64> <i64 -9187201950435737472, i64 -9187201950435737472>) |
| %tmp0 = tail call <2 x i64> @llvm.x86.pclmulqdq(<2 x i64> undef, <2 x i64> <i64 7631803798, i64 5708721108>, i8 16) |
| %call1 = tail call <4 x float> @_mm_castsi128_ps(<2 x i64> %tmp0) |
| ret void |
| ; CHECK-LABEL: test1: |
| ; CHECK: movl %esp, |
| ; CHECK: calll _memcpy |
| ; CHECK: movaps __xmm@{{[0-9a-f]+}}, %xmm1 |
| ; CHECK: calll __mm_xor_si128 |
| ; CHECK: pclmulqdq $16, __xmm@{{[0-9a-f]+}}, %xmm0 |
| ; CHECK: jmp __mm_castsi128_ps |
| } |
| |
| declare i32 @GetLastError(...) |
| declare void @IsolationAwareDeactivateActCtx(i32, i32) |
| declare i8* @llvm.localaddress() |
| declare void @llvm.localescape(...) |
| declare i8* @llvm.localrecover(i8*, i8*, i32) |
| |
| @IsolationAwarePrivateT_SqbjaYRiRY = common global i32 0, align 4 |
| |
| ; Check that the MCSymbol objects are created to be used in "\01?fin$0@0@test2@@". |
| define void @test2() #0 { |
| entry: |
| %fActivateActCtxSuccess = alloca i32, align 4 |
| %proc = alloca i32, align 4 |
| %ulpCookie = alloca i32, align 4 |
| call void (...) @llvm.localescape(i32* nonnull %fActivateActCtxSuccess, i32* nonnull %proc, i32* nonnull %ulpCookie) |
| %tmp0 = tail call i8* @llvm.localaddress() |
| call fastcc void @"\01?fin$0@0@test2@@"(i8* %tmp0) |
| ret void |
| ; CHECK-LABEL: test2: |
| ; CHECK: .set Ltest2$frame_escape_0, 8 |
| ; CHECK: .set Ltest2$frame_escape_1, 4 |
| ; CHECK: .set Ltest2$frame_escape_2, 0 |
| ; CHECK: calll "?fin$0@0@test2@@" |
| } |
| |
| ; Check that the LEA optimization pass works with MCSymbol address displacements. |
| define internal fastcc void @"\01?fin$0@0@test2@@"(i8* readonly %frame_pointer) unnamed_addr noinline nounwind optsize { |
| entry: |
| %tmp0 = tail call i8* @llvm.localrecover(i8* bitcast (void ()* @test2 to i8*), i8* %frame_pointer, i32 1) |
| %proc = bitcast i8* %tmp0 to i32* |
| %tmp1 = tail call i8* @llvm.localrecover(i8* bitcast (void ()* @test2 to i8*), i8* %frame_pointer, i32 2) |
| %ulpCookie = bitcast i8* %tmp1 to i32* |
| %tmp2 = load i32, i32* @IsolationAwarePrivateT_SqbjaYRiRY, align 4 |
| %tobool = icmp eq i32 %tmp2, 0 |
| br i1 %tobool, label %if.end, label %land.lhs.true |
| |
| land.lhs.true: |
| %tmp3 = tail call i8* @llvm.localrecover(i8* bitcast (void ()* @test2 to i8*), i8* %frame_pointer, i32 0) |
| %fActivateActCtxSuccess = bitcast i8* %tmp3 to i32* |
| %tmp4 = load i32, i32* %fActivateActCtxSuccess, align 4 |
| %tobool1 = icmp eq i32 %tmp4, 0 |
| br i1 %tobool1, label %if.end, label %if.then |
| |
| if.then: |
| %tmp5 = load i32, i32* %proc, align 4 |
| %tobool2 = icmp eq i32 %tmp5, 0 |
| br i1 %tobool2, label %cond.end, label %cond.true |
| |
| cond.true: |
| %call = tail call i32 bitcast (i32 (...)* @GetLastError to i32 ()*)() |
| br label %cond.end |
| |
| cond.end: |
| %tmp6 = load i32, i32* %ulpCookie, align 4 |
| tail call void @IsolationAwareDeactivateActCtx(i32 0, i32 %tmp6) |
| br label %if.end |
| |
| if.end: |
| ret void |
| ; CHECK-LABEL: "?fin$0@0@test2@@": |
| ; CHECK: cmpl $0, Ltest2$frame_escape_0([[REG1:%[a-z]+]]) |
| ; CHECK: leal Ltest2$frame_escape_1([[REG1]]), [[REG2:%[a-z]+]] |
| ; CHECK: leal Ltest2$frame_escape_2([[REG1]]), [[REG3:%[a-z]+]] |
| ; CHECK: cmpl $0, ([[REG2]]) |
| ; CHECK: pushl ([[REG3]]) |
| } |
| |
| attributes #0 = { nounwind optsize "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-features"="+mmx,+pclmul,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3" "unsafe-fp-math"="false" "use-soft-float"="false" } |