xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/immediate_merging.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -o - -mtriple=i386-unknown-linux-gnu < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -o - -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker@a = common global i32 0, align 4
5*9880d681SAndroid Build Coastguard Worker@b = common global i32 0, align 4
6*9880d681SAndroid Build Coastguard Worker@c = common global i32 0, align 4
7*9880d681SAndroid Build Coastguard Worker@e = common global i32 0, align 4
8*9880d681SAndroid Build Coastguard Worker@x = common global i32 0, align 4
9*9880d681SAndroid Build Coastguard Worker@f = common global i32 0, align 4
10*9880d681SAndroid Build Coastguard Worker@h = common global i32 0, align 4
11*9880d681SAndroid Build Coastguard Worker@i = common global i32 0, align 4
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; Test -Os to make sure immediates with multiple users don't get pulled in to
14*9880d681SAndroid Build Coastguard Worker; instructions.
15*9880d681SAndroid Build Coastguard Workerdefine i32 @foo() optsize {
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo:
17*9880d681SAndroid Build Coastguard Worker; CHECK: movl $1234, [[R1:%[a-z]+]]
18*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl $1234, a
19*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl $1234, b
20*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl $12, c
21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl $12, e
22*9880d681SAndroid Build Coastguard Worker; CHECK: movl [[R1]], a
23*9880d681SAndroid Build Coastguard Worker; CHECK: movl [[R1]], b
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerentry:
26*9880d681SAndroid Build Coastguard Worker  store i32 1234, i32* @a
27*9880d681SAndroid Build Coastguard Worker  store i32 1234, i32* @b
28*9880d681SAndroid Build Coastguard Worker  store i32 12, i32* @c
29*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @e
30*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %0, 12
31*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
34*9880d681SAndroid Build Coastguard Worker  store i32 1, i32* @x
35*9880d681SAndroid Build Coastguard Worker  br label %if.end
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; New block.. Make sure 1234 isn't live across basic blocks from before.
38*9880d681SAndroid Build Coastguard Worker; CHECK: movl $1234, f
39*9880d681SAndroid Build Coastguard Worker; CHECK: movl $555, [[R3:%[a-z]+]]
40*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl $555, h
41*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: addl $555, i
42*9880d681SAndroid Build Coastguard Worker; CHECK: movl [[R3]], h
43*9880d681SAndroid Build Coastguard Worker; CHECK: addl [[R3]], i
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
46*9880d681SAndroid Build Coastguard Worker  store i32 1234, i32* @f
47*9880d681SAndroid Build Coastguard Worker  store i32 555, i32* @h
48*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @i
49*9880d681SAndroid Build Coastguard Worker  %add1 = add nsw i32 %1, 555
50*9880d681SAndroid Build Coastguard Worker  store i32 %add1, i32* @i
51*9880d681SAndroid Build Coastguard Worker  ret i32 0
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; Test -O2 to make sure that all immediates get pulled in to their users.
55*9880d681SAndroid Build Coastguard Workerdefine i32 @foo2() {
56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo2:
57*9880d681SAndroid Build Coastguard Worker; CHECK: movl $1234, a
58*9880d681SAndroid Build Coastguard Worker; CHECK: movl $1234, b
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker  store i32 1234, i32* @a
62*9880d681SAndroid Build Coastguard Worker  store i32 1234, i32* @b
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker  ret i32 0
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) #1
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker@AA = common global [100 x i8] zeroinitializer, align 1
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; memset gets lowered in DAG. Constant merging should hoist all the
72*9880d681SAndroid Build Coastguard Worker; immediates used to store to the individual memory locations. Make
73*9880d681SAndroid Build Coastguard Worker; sure we don't directly store the immediates.
74*9880d681SAndroid Build Coastguard Workerdefine void @foomemset() optsize {
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foomemset:
76*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl ${{.*}}, AA
77*9880d681SAndroid Build Coastguard Worker; CHECK: mov{{l|q}} %{{e|r}}ax, AA
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerentry:
80*9880d681SAndroid Build Coastguard Worker  call void @llvm.memset.p0i8.i32(i8* getelementptr inbounds ([100 x i8], [100 x i8]* @AA, i32 0, i32 0), i8 33, i32 24, i32 1, i1 false)
81*9880d681SAndroid Build Coastguard Worker  ret void
82*9880d681SAndroid Build Coastguard Worker}
83