xref: /aosp_15_r20/external/llvm/test/CodeGen/Hexagon/insert4.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=hexagon < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; Check that we are generating insert instructions.
3*9880d681SAndroid Build Coastguard Worker; CHECK: insert
4*9880d681SAndroid Build Coastguard Worker; CHECK: insert
5*9880d681SAndroid Build Coastguard Worker; CHECK: insert
6*9880d681SAndroid Build Coastguard Worker; CHECK: insert
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32"
9*9880d681SAndroid Build Coastguard Workertarget triple = "hexagon"
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker%struct.a = type { i16 }
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdefine i32 @fun(%struct.a* nocapture %pData, i64 %c, i64* nocapture %d, i64* nocapture %e, i64* nocapture %f) #0 {
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker  %g = getelementptr inbounds %struct.a, %struct.a* %pData, i32 0, i32 0
16*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %g, align 2, !tbaa !0
17*9880d681SAndroid Build Coastguard Worker  %conv185 = sext i16 %0 to i32
18*9880d681SAndroid Build Coastguard Worker  %shr86 = ashr i32 %conv185, 2
19*9880d681SAndroid Build Coastguard Worker  %cmp87 = icmp sgt i32 %shr86, 0
20*9880d681SAndroid Build Coastguard Worker  br i1 %cmp87, label %for.body.lr.ph, label %for.end
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerfor.body.lr.ph:                                   ; preds = %entry
23*9880d681SAndroid Build Coastguard Worker  %h.sroa.0.0.extract.trunc = trunc i64 %c to i32
24*9880d681SAndroid Build Coastguard Worker  %sext = shl i32 %h.sroa.0.0.extract.trunc, 16
25*9880d681SAndroid Build Coastguard Worker  %conv8 = ashr exact i32 %sext, 16
26*9880d681SAndroid Build Coastguard Worker  %l.sroa.2.4.extract.shift = lshr i64 %c, 32
27*9880d681SAndroid Build Coastguard Worker  %sext76 = ashr i32 %h.sroa.0.0.extract.trunc, 16
28*9880d681SAndroid Build Coastguard Worker  %m.sroa.2.6.extract.shift = lshr i64 %c, 48
29*9880d681SAndroid Build Coastguard Worker  %sext7980 = shl nuw nsw i64 %l.sroa.2.4.extract.shift, 16
30*9880d681SAndroid Build Coastguard Worker  %sext79 = trunc i64 %sext7980 to i32
31*9880d681SAndroid Build Coastguard Worker  %conv38 = ashr exact i32 %sext79, 16
32*9880d681SAndroid Build Coastguard Worker  %sext8283 = shl nuw nsw i64 %m.sroa.2.6.extract.shift, 16
33*9880d681SAndroid Build Coastguard Worker  %sext82 = trunc i64 %sext8283 to i32
34*9880d681SAndroid Build Coastguard Worker  %conv53 = ashr exact i32 %sext82, 16
35*9880d681SAndroid Build Coastguard Worker  br label %for.body
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.lr.ph, %for.body
38*9880d681SAndroid Build Coastguard Worker  %arrayidx.phi = phi i64* [ %d, %for.body.lr.ph ], [ %arrayidx.inc, %for.body ]
39*9880d681SAndroid Build Coastguard Worker  %arrayidx30.phi = phi i64* [ %f, %for.body.lr.ph ], [ %arrayidx30.inc, %for.body ]
40*9880d681SAndroid Build Coastguard Worker  %arrayidx60.phi = phi i64* [ %e, %for.body.lr.ph ], [ %arrayidx60.inc, %for.body ]
41*9880d681SAndroid Build Coastguard Worker  %j.088.pmt = phi i32 [ 0, %for.body.lr.ph ], [ %inc.pmt, %for.body ]
42*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* %arrayidx.phi, align 8, !tbaa !1
43*9880d681SAndroid Build Coastguard Worker  %n_union3.sroa.0.0.extract.trunc = trunc i64 %1 to i32
44*9880d681SAndroid Build Coastguard Worker  %n_union3.sroa.1.4.extract.shift = lshr i64 %1, 32
45*9880d681SAndroid Build Coastguard Worker  %2 = tail call i64 @llvm.hexagon.M2.dpmpyss.s0(i32 %n_union3.sroa.0.0.extract.trunc, i32 %conv8)
46*9880d681SAndroid Build Coastguard Worker  %3 = tail call i64 @llvm.hexagon.S2.asl.r.p(i64 %2, i32 -25)
47*9880d681SAndroid Build Coastguard Worker  %conv9 = trunc i64 %3 to i32
48*9880d681SAndroid Build Coastguard Worker  %4 = tail call i32 @llvm.hexagon.A2.sath(i32 %conv9)
49*9880d681SAndroid Build Coastguard Worker  %n_union13.sroa.1.4.extract.trunc = trunc i64 %n_union3.sroa.1.4.extract.shift to i32
50*9880d681SAndroid Build Coastguard Worker  %5 = tail call i64 @llvm.hexagon.M2.dpmpyss.s0(i32 %n_union13.sroa.1.4.extract.trunc, i32 %sext76)
51*9880d681SAndroid Build Coastguard Worker  %6 = tail call i64 @llvm.hexagon.S2.asl.r.p(i64 %5, i32 -25)
52*9880d681SAndroid Build Coastguard Worker  %conv24 = trunc i64 %6 to i32
53*9880d681SAndroid Build Coastguard Worker  %7 = tail call i32 @llvm.hexagon.A2.sath(i32 %conv24)
54*9880d681SAndroid Build Coastguard Worker  %8 = load i64, i64* %arrayidx30.phi, align 8, !tbaa !1
55*9880d681SAndroid Build Coastguard Worker  %n_union28.sroa.0.0.extract.trunc = trunc i64 %8 to i32
56*9880d681SAndroid Build Coastguard Worker  %n_union28.sroa.1.4.extract.shift = lshr i64 %8, 32
57*9880d681SAndroid Build Coastguard Worker  %9 = tail call i64 @llvm.hexagon.M2.dpmpyss.s0(i32 %n_union28.sroa.0.0.extract.trunc, i32 %conv38)
58*9880d681SAndroid Build Coastguard Worker  %10 = tail call i64 @llvm.hexagon.S2.asl.r.p(i64 %9, i32 -25)
59*9880d681SAndroid Build Coastguard Worker  %conv39 = trunc i64 %10 to i32
60*9880d681SAndroid Build Coastguard Worker  %11 = tail call i32 @llvm.hexagon.A2.sath(i32 %conv39)
61*9880d681SAndroid Build Coastguard Worker  %n_union43.sroa.1.4.extract.trunc = trunc i64 %n_union28.sroa.1.4.extract.shift to i32
62*9880d681SAndroid Build Coastguard Worker  %12 = tail call i64 @llvm.hexagon.M2.dpmpyss.s0(i32 %n_union43.sroa.1.4.extract.trunc, i32 %conv53)
63*9880d681SAndroid Build Coastguard Worker  %13 = tail call i64 @llvm.hexagon.S2.asl.r.p(i64 %12, i32 -25)
64*9880d681SAndroid Build Coastguard Worker  %conv54 = trunc i64 %13 to i32
65*9880d681SAndroid Build Coastguard Worker  %14 = tail call i32 @llvm.hexagon.A2.sath(i32 %conv54)
66*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.3.6.insert.ext = zext i32 %14 to i64
67*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.3.6.insert.shift = shl i64 %n_union.sroa.3.6.insert.ext, 48
68*9880d681SAndroid Build Coastguard Worker  %conv40.mask = and i32 %11, 65535
69*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.2.4.insert.ext = zext i32 %conv40.mask to i64
70*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.2.4.insert.shift = shl nuw nsw i64 %n_union.sroa.2.4.insert.ext, 32
71*9880d681SAndroid Build Coastguard Worker  %conv25.mask = and i32 %7, 65535
72*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.1.2.insert.ext = zext i32 %conv25.mask to i64
73*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.1.2.insert.shift = shl nuw nsw i64 %n_union.sroa.1.2.insert.ext, 16
74*9880d681SAndroid Build Coastguard Worker  %conv10.mask = and i32 %4, 65535
75*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.0.0.insert.ext = zext i32 %conv10.mask to i64
76*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.2.4.insert.insert = or i64 %n_union.sroa.1.2.insert.shift, %n_union.sroa.0.0.insert.ext
77*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.1.2.insert.insert = or i64 %n_union.sroa.2.4.insert.insert, %n_union.sroa.2.4.insert.shift
78*9880d681SAndroid Build Coastguard Worker  %n_union.sroa.0.0.insert.insert = or i64 %n_union.sroa.1.2.insert.insert, %n_union.sroa.3.6.insert.shift
79*9880d681SAndroid Build Coastguard Worker  %15 = load i64, i64* %arrayidx60.phi, align 8, !tbaa !1
80*9880d681SAndroid Build Coastguard Worker  %16 = tail call i64 @llvm.hexagon.A2.vaddhs(i64 %15, i64 %n_union.sroa.0.0.insert.insert)
81*9880d681SAndroid Build Coastguard Worker  store i64 %16, i64* %arrayidx60.phi, align 8, !tbaa !1
82*9880d681SAndroid Build Coastguard Worker  %inc.pmt = add i32 %j.088.pmt, 1
83*9880d681SAndroid Build Coastguard Worker  %17 = load i16, i16* %g, align 2, !tbaa !0
84*9880d681SAndroid Build Coastguard Worker  %conv1 = sext i16 %17 to i32
85*9880d681SAndroid Build Coastguard Worker  %shr = ashr i32 %conv1, 2
86*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %inc.pmt, %shr
87*9880d681SAndroid Build Coastguard Worker  %arrayidx.inc = getelementptr i64, i64* %arrayidx.phi, i32 1
88*9880d681SAndroid Build Coastguard Worker  %arrayidx30.inc = getelementptr i64, i64* %arrayidx30.phi, i32 1
89*9880d681SAndroid Build Coastguard Worker  %arrayidx60.inc = getelementptr i64, i64* %arrayidx60.phi, i32 1
90*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end.loopexit
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
93*9880d681SAndroid Build Coastguard Worker  br label %for.end
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
96*9880d681SAndroid Build Coastguard Worker  ret i32 0
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.hexagon.A2.sath(i32) #1
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.hexagon.S2.asl.r.p(i64, i32) #1
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.hexagon.M2.dpmpyss.s0(i32, i32) #1
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.hexagon.A2.vaddhs(i64, i64) #1
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "fp-contract-model"="standard" "no-frame-pointer-elim-non-leaf" "realign-stack" "relocation-model"="static" "ssp-buffers-size"="8" }
108*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone }
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker!0 = !{!"short", !1}
111*9880d681SAndroid Build Coastguard Worker!1 = !{!"omnipotent char", !2}
112*9880d681SAndroid Build Coastguard Worker!2 = !{!"Simple C/C++ TBAA"}
113