xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/lea-opt-memop-check-1.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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