xref: /llvm-project/llvm/test/Transforms/InstCombine/extractinsert-tbaa.ll (revision 4ab40eca080965c65802710e39adbb78c4ce7bde)
1; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s
2
3%Complex = type { double, double }
4
5; Check that instcombine preserves TBAA when narrowing loads
6define double @teststructextract(ptr %val) {
7; CHECK: load double, {{.*}}, !tbaa
8; CHECK-NOT: load %Complex
9    %loaded = load %Complex, ptr %val, !tbaa !1
10    %real = extractvalue %Complex %loaded, 0
11    ret double %real
12}
13
14define double @testarrayextract(ptr %val) {
15; CHECK: load double, {{.*}}, !tbaa
16; CHECK-NOT: load [2 x double]
17    %loaded = load [2 x double], ptr %val, !tbaa !1
18    %real = extractvalue [2 x double] %loaded, 0
19    ret double %real
20}
21
22; Check that inscombine preserves TBAA when breaking up stores
23define void @teststructinsert(ptr %loc, double %a, double %b) {
24; CHECK: store double %a, {{.*}}, !tbaa
25; CHECK: store double %b, {{.*}}, !tbaa
26; CHECK-NOT: store %Complex
27    %inserted  = insertvalue %Complex undef,      double %a, 0
28    %inserted2 = insertvalue %Complex %inserted,  double %b, 1
29    store %Complex %inserted2, ptr %loc, !tbaa !1
30    ret void
31}
32
33define void @testarrayinsert(ptr %loc, double %a, double %b) {
34; CHECK: store double %a, {{.*}}, !tbaa
35; CHECK: store double %b, {{.*}}, !tbaa
36; CHECK-NOT: store [2 x double]
37    %inserted  = insertvalue [2 x double] undef,      double %a, 0
38    %inserted2 = insertvalue [2 x double] %inserted,  double %b, 1
39    store [2 x double] %inserted2, ptr %loc, !tbaa !1
40    ret void
41}
42
43!0 = !{!"tbaa_root"}
44!1 = !{!2, !2, i64 0}
45!2 = !{!"Complex", !0, i64 0}
46