1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mtriple=i686-pc-win32 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; PR26575 4*9880d681SAndroid Build Coastguard Worker; Assertion `(Disp->isImm() || Disp->isGlobal()) && (Other.Disp->isImm() || Other.Disp->isGlobal()) && "Address displacement operand is always an immediate or a global"' failed. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" 7*9880d681SAndroid Build Coastguard Workertarget triple = "i686-pc-windows-msvc" 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) argmemonly nounwind 10*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @_mm_xor_si128(<2 x i64>, <2 x i64>) optsize 11*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.x86.pclmulqdq(<2 x i64>, <2 x i64>, i8) nounwind readnone 12*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @_mm_castsi128_ps(<2 x i64>) optsize 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; Check that the LEA optimization pass works with CPI address displacements. 15*9880d681SAndroid Build Coastguard Workerdefine void @test1(i8* nocapture readonly %src, i32 %len) #0 { 16*9880d681SAndroid Build Coastguard Worker %parts = alloca [4 x i32], align 4 17*9880d681SAndroid Build Coastguard Worker %part0 = bitcast [4 x i32]* %parts to i8* 18*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %part0, i8* %src, i32 %len, i32 1, i1 false) 19*9880d681SAndroid Build Coastguard Worker %call0 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> undef, <2 x i64> <i64 -9187201950435737472, i64 -9187201950435737472>) 20*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call <2 x i64> @llvm.x86.pclmulqdq(<2 x i64> undef, <2 x i64> <i64 7631803798, i64 5708721108>, i8 16) 21*9880d681SAndroid Build Coastguard Worker %call1 = tail call <4 x float> @_mm_castsi128_ps(<2 x i64> %tmp0) 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 24*9880d681SAndroid Build Coastguard Worker; CHECK: leal{{.*}} 25*9880d681SAndroid Build Coastguard Worker; CHECK: calll _memcpy 26*9880d681SAndroid Build Coastguard Worker; CHECK: movaps __xmm@{{[0-9a-f]+}}, %xmm1 27*9880d681SAndroid Build Coastguard Worker; CHECK: calll __mm_xor_si128 28*9880d681SAndroid Build Coastguard Worker; CHECK: pclmulqdq $16, __xmm@{{[0-9a-f]+}}, %xmm0 29*9880d681SAndroid Build Coastguard Worker; CHECK: jmp __mm_castsi128_ps 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdeclare i32 @GetLastError(...) 33*9880d681SAndroid Build Coastguard Workerdeclare void @IsolationAwareDeactivateActCtx(i32, i32) 34*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.localaddress() 35*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.localescape(...) 36*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.localrecover(i8*, i8*, i32) 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker@IsolationAwarePrivateT_SqbjaYRiRY = common global i32 0, align 4 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; Check that the MCSymbol objects are created to be used in "\01?fin$0@0@test2@@". 41*9880d681SAndroid Build Coastguard Workerdefine void @test2() #0 { 42*9880d681SAndroid Build Coastguard Workerentry: 43*9880d681SAndroid Build Coastguard Worker %fActivateActCtxSuccess = alloca i32, align 4 44*9880d681SAndroid Build Coastguard Worker %proc = alloca i32, align 4 45*9880d681SAndroid Build Coastguard Worker %ulpCookie = alloca i32, align 4 46*9880d681SAndroid Build Coastguard Worker call void (...) @llvm.localescape(i32* nonnull %fActivateActCtxSuccess, i32* nonnull %proc, i32* nonnull %ulpCookie) 47*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call i8* @llvm.localaddress() 48*9880d681SAndroid Build Coastguard Worker call fastcc void @"\01?fin$0@0@test2@@"(i8* %tmp0) 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 51*9880d681SAndroid Build Coastguard Worker; CHECK: Ltest2$frame_escape_0 = 8 52*9880d681SAndroid Build Coastguard Worker; CHECK: Ltest2$frame_escape_1 = 4 53*9880d681SAndroid Build Coastguard Worker; CHECK: Ltest2$frame_escape_2 = 0 54*9880d681SAndroid Build Coastguard Worker; CHECK: calll "?fin$0@0@test2@@" 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; Check that the LEA optimization pass works with MCSymbol address displacements. 58*9880d681SAndroid Build Coastguard Workerdefine internal fastcc void @"\01?fin$0@0@test2@@"(i8* readonly %frame_pointer) unnamed_addr noinline nounwind optsize { 59*9880d681SAndroid Build Coastguard Workerentry: 60*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call i8* @llvm.localrecover(i8* bitcast (void ()* @test2 to i8*), i8* %frame_pointer, i32 1) 61*9880d681SAndroid Build Coastguard Worker %proc = bitcast i8* %tmp0 to i32* 62*9880d681SAndroid Build Coastguard Worker %tmp1 = tail call i8* @llvm.localrecover(i8* bitcast (void ()* @test2 to i8*), i8* %frame_pointer, i32 2) 63*9880d681SAndroid Build Coastguard Worker %ulpCookie = bitcast i8* %tmp1 to i32* 64*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* @IsolationAwarePrivateT_SqbjaYRiRY, align 4 65*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %tmp2, 0 66*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %land.lhs.true 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerland.lhs.true: 69*9880d681SAndroid Build Coastguard Worker %tmp3 = tail call i8* @llvm.localrecover(i8* bitcast (void ()* @test2 to i8*), i8* %frame_pointer, i32 0) 70*9880d681SAndroid Build Coastguard Worker %fActivateActCtxSuccess = bitcast i8* %tmp3 to i32* 71*9880d681SAndroid Build Coastguard Worker %tmp4 = load i32, i32* %fActivateActCtxSuccess, align 4 72*9880d681SAndroid Build Coastguard Worker %tobool1 = icmp eq i32 %tmp4, 0 73*9880d681SAndroid Build Coastguard Worker br i1 %tobool1, label %if.end, label %if.then 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerif.then: 76*9880d681SAndroid Build Coastguard Worker %tmp5 = load i32, i32* %proc, align 4 77*9880d681SAndroid Build Coastguard Worker %tobool2 = icmp eq i32 %tmp5, 0 78*9880d681SAndroid Build Coastguard Worker br i1 %tobool2, label %cond.end, label %cond.true 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workercond.true: 81*9880d681SAndroid Build Coastguard Worker %call = tail call i32 bitcast (i32 (...)* @GetLastError to i32 ()*)() 82*9880d681SAndroid Build Coastguard Worker br label %cond.end 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workercond.end: 85*9880d681SAndroid Build Coastguard Worker %tmp6 = load i32, i32* %ulpCookie, align 4 86*9880d681SAndroid Build Coastguard Worker tail call void @IsolationAwareDeactivateActCtx(i32 0, i32 %tmp6) 87*9880d681SAndroid Build Coastguard Worker br label %if.end 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerif.end: 90*9880d681SAndroid Build Coastguard Worker ret void 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: "?fin$0@0@test2@@": 92*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $0, Ltest2$frame_escape_0([[REG1:%[a-z]+]]) 93*9880d681SAndroid Build Coastguard Worker; CHECK: leal Ltest2$frame_escape_1([[REG1]]), [[REG2:%[a-z]+]] 94*9880d681SAndroid Build Coastguard Worker; CHECK: leal Ltest2$frame_escape_2([[REG1]]), [[REG3:%[a-z]+]] 95*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $0, ([[REG2]]) 96*9880d681SAndroid Build Coastguard Worker; CHECK: pushl ([[REG3]]) 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerattributes #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" } 100