brintos

brintos / llvm-project-archived public Read only

0
0
Text · 30.7 KiB · 82ecc3a Raw
486 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt -S -O3 < %s | FileCheck %s3 4; Check unrolling / SLP vectorization where the order of lanes is important for5; producing efficient shuffles. The shuffles should be regular and cheap for6; AArch64. [0 2 4 6] and [1 3 5 7] will produce uzp1/uzp2 instruction. The7; v16i32 shuffles will be legalized to individual v4i32.8 9target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"10target triple = "aarch64"11 12; Function Attrs: nounwind uwtable13define i32 @slpordering(ptr noundef %p1, i32 noundef %ip1, ptr noundef %p2, i32 noundef %ip2) {14; CHECK-LABEL: define range(i32 0, 65536) i32 @slpordering(15; CHECK-SAME: ptr noundef readonly captures(none) [[P1:%.*]], i32 noundef [[IP1:%.*]], ptr noundef readonly captures(none) [[P2:%.*]], i32 noundef [[IP2:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {16; CHECK-NEXT:  [[ENTRY:.*:]]17; CHECK-NEXT:    [[IDX_EXT:%.*]] = sext i32 [[IP1]] to i6418; CHECK-NEXT:    [[IDX_EXT63:%.*]] = sext i32 [[IP2]] to i6419; CHECK-NEXT:    [[RRRAYIDX3:%.*]] = getelementptr inbounds nuw i8, ptr [[P1]], i64 420; CHECK-NEXT:    [[RRRAYIDX5:%.*]] = getelementptr inbounds nuw i8, ptr [[P2]], i64 421; CHECK-NEXT:    [[RDD_PTR:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[IDX_EXT]]22; CHECK-NEXT:    [[RDD_PTR64:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[IDX_EXT63]]23; CHECK-NEXT:    [[RRRAYIDX3_1:%.*]] = getelementptr inbounds nuw i8, ptr [[RDD_PTR]], i64 424; CHECK-NEXT:    [[RRRAYIDX5_1:%.*]] = getelementptr inbounds nuw i8, ptr [[RDD_PTR64]], i64 425; CHECK-NEXT:    [[RDD_PTR_1:%.*]] = getelementptr inbounds i8, ptr [[RDD_PTR]], i64 [[IDX_EXT]]26; CHECK-NEXT:    [[RDD_PTR64_1:%.*]] = getelementptr inbounds i8, ptr [[RDD_PTR64]], i64 [[IDX_EXT63]]27; CHECK-NEXT:    [[RRRAYIDX3_2:%.*]] = getelementptr inbounds nuw i8, ptr [[RDD_PTR_1]], i64 428; CHECK-NEXT:    [[RRRAYIDX5_2:%.*]] = getelementptr inbounds nuw i8, ptr [[RDD_PTR64_1]], i64 429; CHECK-NEXT:    [[RDD_PTR_2:%.*]] = getelementptr inbounds i8, ptr [[RDD_PTR_1]], i64 [[IDX_EXT]]30; CHECK-NEXT:    [[RDD_PTR64_2:%.*]] = getelementptr inbounds i8, ptr [[RDD_PTR64_1]], i64 [[IDX_EXT63]]31; CHECK-NEXT:    [[RRRAYIDX3_3:%.*]] = getelementptr inbounds nuw i8, ptr [[RDD_PTR_2]], i64 432; CHECK-NEXT:    [[RRRAYIDX5_3:%.*]] = getelementptr inbounds nuw i8, ptr [[RDD_PTR64_2]], i64 433; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr [[P1]], align 1, !tbaa [[CHAR_TBAA0:![0-9]+]]34; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i8>, ptr [[P2]], align 1, !tbaa [[CHAR_TBAA0]]35; CHECK-NEXT:    [[TMP2:%.*]] = load <4 x i8>, ptr [[RRRAYIDX3]], align 1, !tbaa [[CHAR_TBAA0]]36; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i8>, ptr [[RRRAYIDX5]], align 1, !tbaa [[CHAR_TBAA0]]37; CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i8>, ptr [[RDD_PTR]], align 1, !tbaa [[CHAR_TBAA0]]38; CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i8>, ptr [[RDD_PTR64]], align 1, !tbaa [[CHAR_TBAA0]]39; CHECK-NEXT:    [[TMP6:%.*]] = load <4 x i8>, ptr [[RRRAYIDX3_1]], align 1, !tbaa [[CHAR_TBAA0]]40; CHECK-NEXT:    [[TMP7:%.*]] = load <4 x i8>, ptr [[RRRAYIDX5_1]], align 1, !tbaa [[CHAR_TBAA0]]41; CHECK-NEXT:    [[TMP8:%.*]] = load <4 x i8>, ptr [[RDD_PTR_1]], align 1, !tbaa [[CHAR_TBAA0]]42; CHECK-NEXT:    [[TMP9:%.*]] = load <4 x i8>, ptr [[RDD_PTR64_1]], align 1, !tbaa [[CHAR_TBAA0]]43; CHECK-NEXT:    [[TMP10:%.*]] = load <4 x i8>, ptr [[RRRAYIDX3_2]], align 1, !tbaa [[CHAR_TBAA0]]44; CHECK-NEXT:    [[TMP11:%.*]] = load <4 x i8>, ptr [[RRRAYIDX5_2]], align 1, !tbaa [[CHAR_TBAA0]]45; CHECK-NEXT:    [[TMP12:%.*]] = load <4 x i8>, ptr [[RDD_PTR_2]], align 1, !tbaa [[CHAR_TBAA0]]46; CHECK-NEXT:    [[TMP13:%.*]] = shufflevector <4 x i8> [[TMP0]], <4 x i8> [[TMP4]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>47; CHECK-NEXT:    [[TMP14:%.*]] = shufflevector <4 x i8> [[TMP8]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>48; CHECK-NEXT:    [[TMP15:%.*]] = shufflevector <16 x i8> [[TMP13]], <16 x i8> [[TMP14]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>49; CHECK-NEXT:    [[TMP16:%.*]] = shufflevector <4 x i8> [[TMP12]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>50; CHECK-NEXT:    [[TMP17:%.*]] = shufflevector <16 x i8> [[TMP15]], <16 x i8> [[TMP16]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>51; CHECK-NEXT:    [[TMP18:%.*]] = zext <16 x i8> [[TMP17]] to <16 x i32>52; CHECK-NEXT:    [[TMP19:%.*]] = load <4 x i8>, ptr [[RDD_PTR64_2]], align 1, !tbaa [[CHAR_TBAA0]]53; CHECK-NEXT:    [[TMP20:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> [[TMP5]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>54; CHECK-NEXT:    [[TMP21:%.*]] = shufflevector <4 x i8> [[TMP9]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>55; CHECK-NEXT:    [[TMP22:%.*]] = shufflevector <16 x i8> [[TMP20]], <16 x i8> [[TMP21]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>56; CHECK-NEXT:    [[TMP23:%.*]] = shufflevector <4 x i8> [[TMP19]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>57; CHECK-NEXT:    [[TMP24:%.*]] = shufflevector <16 x i8> [[TMP22]], <16 x i8> [[TMP23]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>58; CHECK-NEXT:    [[TMP25:%.*]] = zext <16 x i8> [[TMP24]] to <16 x i32>59; CHECK-NEXT:    [[TMP26:%.*]] = sub nsw <16 x i32> [[TMP18]], [[TMP25]]60; CHECK-NEXT:    [[TMP27:%.*]] = load <4 x i8>, ptr [[RRRAYIDX3_3]], align 1, !tbaa [[CHAR_TBAA0]]61; CHECK-NEXT:    [[TMP28:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> [[TMP6]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>62; CHECK-NEXT:    [[TMP29:%.*]] = shufflevector <4 x i8> [[TMP10]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>63; CHECK-NEXT:    [[TMP30:%.*]] = shufflevector <16 x i8> [[TMP28]], <16 x i8> [[TMP29]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>64; CHECK-NEXT:    [[TMP31:%.*]] = shufflevector <4 x i8> [[TMP27]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>65; CHECK-NEXT:    [[TMP32:%.*]] = shufflevector <16 x i8> [[TMP30]], <16 x i8> [[TMP31]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>66; CHECK-NEXT:    [[TMP33:%.*]] = zext <16 x i8> [[TMP32]] to <16 x i32>67; CHECK-NEXT:    [[TMP34:%.*]] = load <4 x i8>, ptr [[RRRAYIDX5_3]], align 1, !tbaa [[CHAR_TBAA0]]68; CHECK-NEXT:    [[TMP35:%.*]] = shufflevector <4 x i8> [[TMP3]], <4 x i8> [[TMP7]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>69; CHECK-NEXT:    [[TMP36:%.*]] = shufflevector <4 x i8> [[TMP11]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>70; CHECK-NEXT:    [[TMP37:%.*]] = shufflevector <16 x i8> [[TMP35]], <16 x i8> [[TMP36]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>71; CHECK-NEXT:    [[TMP38:%.*]] = shufflevector <4 x i8> [[TMP34]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>72; CHECK-NEXT:    [[TMP39:%.*]] = shufflevector <16 x i8> [[TMP37]], <16 x i8> [[TMP38]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>73; CHECK-NEXT:    [[TMP40:%.*]] = zext <16 x i8> [[TMP39]] to <16 x i32>74; CHECK-NEXT:    [[TMP41:%.*]] = sub nsw <16 x i32> [[TMP33]], [[TMP40]]75; CHECK-NEXT:    [[TMP42:%.*]] = shl nsw <16 x i32> [[TMP41]], splat (i32 16)76; CHECK-NEXT:    [[TMP43:%.*]] = add nsw <16 x i32> [[TMP42]], [[TMP26]]77; CHECK-NEXT:    [[TMP44:%.*]] = shufflevector <16 x i32> [[TMP43]], <16 x i32> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>78; CHECK-NEXT:    [[TMP45:%.*]] = shufflevector <16 x i32> [[TMP43]], <16 x i32> poison, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>79; CHECK-NEXT:    [[TMP46:%.*]] = shufflevector <16 x i32> [[TMP43]], <16 x i32> poison, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>80; CHECK-NEXT:    [[TMP47:%.*]] = shufflevector <16 x i32> [[TMP43]], <16 x i32> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>81; CHECK-NEXT:    [[TMP48:%.*]] = add nsw <16 x i32> [[TMP45]], [[TMP47]]82; CHECK-NEXT:    [[TMP49:%.*]] = sub nsw <16 x i32> [[TMP44]], [[TMP46]]83; CHECK-NEXT:    [[TMP50:%.*]] = shufflevector <16 x i32> [[TMP48]], <16 x i32> [[TMP49]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>84; CHECK-NEXT:    [[TMP51:%.*]] = shufflevector <16 x i32> [[TMP48]], <16 x i32> [[TMP49]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>85; CHECK-NEXT:    [[TMP52:%.*]] = shufflevector <16 x i32> [[TMP48]], <16 x i32> [[TMP49]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>86; CHECK-NEXT:    [[TMP53:%.*]] = shufflevector <16 x i32> [[TMP48]], <16 x i32> [[TMP49]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>87; CHECK-NEXT:    [[TMP54:%.*]] = add nsw <16 x i32> [[TMP51]], [[TMP53]]88; CHECK-NEXT:    [[TMP55:%.*]] = sub nsw <16 x i32> [[TMP50]], [[TMP52]]89; CHECK-NEXT:    [[TMP56:%.*]] = shufflevector <16 x i32> [[TMP54]], <16 x i32> [[TMP55]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>90; CHECK-NEXT:    [[TMP57:%.*]] = shufflevector <16 x i32> [[TMP54]], <16 x i32> [[TMP55]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>91; CHECK-NEXT:    [[TMP58:%.*]] = shufflevector <16 x i32> [[TMP54]], <16 x i32> [[TMP55]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>92; CHECK-NEXT:    [[TMP59:%.*]] = shufflevector <16 x i32> [[TMP54]], <16 x i32> [[TMP55]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>93; CHECK-NEXT:    [[TMP60:%.*]] = sub nsw <16 x i32> [[TMP57]], [[TMP59]]94; CHECK-NEXT:    [[TMP61:%.*]] = add nsw <16 x i32> [[TMP56]], [[TMP58]]95; CHECK-NEXT:    [[TMP62:%.*]] = shufflevector <16 x i32> [[TMP60]], <16 x i32> [[TMP61]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>96; CHECK-NEXT:    [[TMP63:%.*]] = shufflevector <16 x i32> [[TMP60]], <16 x i32> [[TMP61]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>97; CHECK-NEXT:    [[TMP64:%.*]] = shufflevector <16 x i32> [[TMP60]], <16 x i32> [[TMP61]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>98; CHECK-NEXT:    [[TMP65:%.*]] = shufflevector <16 x i32> [[TMP60]], <16 x i32> [[TMP61]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>99; CHECK-NEXT:    [[TMP66:%.*]] = add nsw <16 x i32> [[TMP63]], [[TMP65]]100; CHECK-NEXT:    [[TMP67:%.*]] = sub nsw <16 x i32> [[TMP62]], [[TMP64]]101; CHECK-NEXT:    [[TMP68:%.*]] = shufflevector <16 x i32> [[TMP66]], <16 x i32> [[TMP67]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>102; CHECK-NEXT:    [[TMP69:%.*]] = lshr <16 x i32> [[TMP68]], splat (i32 15)103; CHECK-NEXT:    [[TMP70:%.*]] = and <16 x i32> [[TMP69]], splat (i32 65537)104; CHECK-NEXT:    [[TMP71:%.*]] = mul nuw <16 x i32> [[TMP70]], splat (i32 65535)105; CHECK-NEXT:    [[TMP72:%.*]] = add <16 x i32> [[TMP71]], [[TMP68]]106; CHECK-NEXT:    [[TMP73:%.*]] = xor <16 x i32> [[TMP72]], [[TMP71]]107; CHECK-NEXT:    [[TMP74:%.*]] = tail call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> [[TMP73]])108; CHECK-NEXT:    [[CONV118:%.*]] = and i32 [[TMP74]], 65535109; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[TMP74]], 16110; CHECK-NEXT:    [[RDD119:%.*]] = add nuw nsw i32 [[CONV118]], [[SHR]]111; CHECK-NEXT:    [[SHR120:%.*]] = lshr i32 [[RDD119]], 1112; CHECK-NEXT:    ret i32 [[SHR120]]113;114entry:115  %p1.addr = alloca ptr, align 8116  %ip1.addr = alloca i32, align 4117  %p2.addr = alloca ptr, align 8118  %ip2.addr = alloca i32, align 4119  %emp = alloca [4 x [4 x i32]], align 4120  %r0 = alloca i32, align 4121  %r1 = alloca i32, align 4122  %r2 = alloca i32, align 4123  %r3 = alloca i32, align 4124  %sum = alloca i32, align 4125  %i = alloca i32, align 4126  %e0 = alloca i32, align 4127  %e1 = alloca i32, align 4128  %e2 = alloca i32, align 4129  %e3 = alloca i32, align 4130  %i65 = alloca i32, align 4131  %e071 = alloca i32, align 4132  %e179 = alloca i32, align 4133  %e287 = alloca i32, align 4134  %e395 = alloca i32, align 4135  store ptr %p1, ptr %p1.addr, align 8, !tbaa !4136  store i32 %ip1, ptr %ip1.addr, align 4, !tbaa !8137  store ptr %p2, ptr %p2.addr, align 8, !tbaa !4138  store i32 %ip2, ptr %ip2.addr, align 4, !tbaa !8139  call void @llvm.lifetime.start.p0(ptr %emp)140  call void @llvm.lifetime.start.p0(ptr %r0)141  call void @llvm.lifetime.start.p0(ptr %r1)142  call void @llvm.lifetime.start.p0(ptr %r2)143  call void @llvm.lifetime.start.p0(ptr %r3)144  call void @llvm.lifetime.start.p0(ptr %sum)145  store i32 0, ptr %sum, align 4, !tbaa !8146  call void @llvm.lifetime.start.p0(ptr %i)147  store i32 0, ptr %i, align 4, !tbaa !8148  br label %for.cond149 150for.cond:                                         ; preds = %for.inc, %entry151  %0 = load i32, ptr %i, align 4, !tbaa !8152  %cmp = icmp slt i32 %0, 4153  br i1 %cmp, label %for.body, label %for.cond.cleanup154 155for.cond.cleanup:                                 ; preds = %for.cond156  call void @llvm.lifetime.end.p0(ptr %i)157  br label %for.end158 159for.body:                                         ; preds = %for.cond160  %1 = load ptr, ptr %p1.addr, align 8, !tbaa !4161  %rrrayidx = getelementptr inbounds i8, ptr %1, i64 0162  %2 = load i8, ptr %rrrayidx, align 1, !tbaa !10163  %conv = zext i8 %2 to i32164  %3 = load ptr, ptr %p2.addr, align 8, !tbaa !4165  %rrrayidx1 = getelementptr inbounds i8, ptr %3, i64 0166  %4 = load i8, ptr %rrrayidx1, align 1, !tbaa !10167  %conv2 = zext i8 %4 to i32168  %sub = sub nsw i32 %conv, %conv2169  %5 = load ptr, ptr %p1.addr, align 8, !tbaa !4170  %rrrayidx3 = getelementptr inbounds i8, ptr %5, i64 4171  %6 = load i8, ptr %rrrayidx3, align 1, !tbaa !10172  %conv4 = zext i8 %6 to i32173  %7 = load ptr, ptr %p2.addr, align 8, !tbaa !4174  %rrrayidx5 = getelementptr inbounds i8, ptr %7, i64 4175  %8 = load i8, ptr %rrrayidx5, align 1, !tbaa !10176  %conv6 = zext i8 %8 to i32177  %sub7 = sub nsw i32 %conv4, %conv6178  %shl = shl i32 %sub7, 16179  %rdd = add nsw i32 %sub, %shl180  store i32 %rdd, ptr %r0, align 4, !tbaa !8181  %9 = load ptr, ptr %p1.addr, align 8, !tbaa !4182  %rrrayidx8 = getelementptr inbounds i8, ptr %9, i64 1183  %10 = load i8, ptr %rrrayidx8, align 1, !tbaa !10184  %conv9 = zext i8 %10 to i32185  %11 = load ptr, ptr %p2.addr, align 8, !tbaa !4186  %rrrayidx10 = getelementptr inbounds i8, ptr %11, i64 1187  %12 = load i8, ptr %rrrayidx10, align 1, !tbaa !10188  %conv11 = zext i8 %12 to i32189  %sub12 = sub nsw i32 %conv9, %conv11190  %13 = load ptr, ptr %p1.addr, align 8, !tbaa !4191  %rrrayidx13 = getelementptr inbounds i8, ptr %13, i64 5192  %14 = load i8, ptr %rrrayidx13, align 1, !tbaa !10193  %conv14 = zext i8 %14 to i32194  %15 = load ptr, ptr %p2.addr, align 8, !tbaa !4195  %rrrayidx15 = getelementptr inbounds i8, ptr %15, i64 5196  %16 = load i8, ptr %rrrayidx15, align 1, !tbaa !10197  %conv16 = zext i8 %16 to i32198  %sub17 = sub nsw i32 %conv14, %conv16199  %shl18 = shl i32 %sub17, 16200  %rdd19 = add nsw i32 %sub12, %shl18201  store i32 %rdd19, ptr %r1, align 4, !tbaa !8202  %17 = load ptr, ptr %p1.addr, align 8, !tbaa !4203  %rrrayidx20 = getelementptr inbounds i8, ptr %17, i64 2204  %18 = load i8, ptr %rrrayidx20, align 1, !tbaa !10205  %conv21 = zext i8 %18 to i32206  %19 = load ptr, ptr %p2.addr, align 8, !tbaa !4207  %rrrayidx22 = getelementptr inbounds i8, ptr %19, i64 2208  %20 = load i8, ptr %rrrayidx22, align 1, !tbaa !10209  %conv23 = zext i8 %20 to i32210  %sub24 = sub nsw i32 %conv21, %conv23211  %21 = load ptr, ptr %p1.addr, align 8, !tbaa !4212  %rrrayidx25 = getelementptr inbounds i8, ptr %21, i64 6213  %22 = load i8, ptr %rrrayidx25, align 1, !tbaa !10214  %conv26 = zext i8 %22 to i32215  %23 = load ptr, ptr %p2.addr, align 8, !tbaa !4216  %rrrayidx27 = getelementptr inbounds i8, ptr %23, i64 6217  %24 = load i8, ptr %rrrayidx27, align 1, !tbaa !10218  %conv28 = zext i8 %24 to i32219  %sub29 = sub nsw i32 %conv26, %conv28220  %shl30 = shl i32 %sub29, 16221  %rdd31 = add nsw i32 %sub24, %shl30222  store i32 %rdd31, ptr %r2, align 4, !tbaa !8223  %25 = load ptr, ptr %p1.addr, align 8, !tbaa !4224  %rrrayidx32 = getelementptr inbounds i8, ptr %25, i64 3225  %26 = load i8, ptr %rrrayidx32, align 1, !tbaa !10226  %conv33 = zext i8 %26 to i32227  %27 = load ptr, ptr %p2.addr, align 8, !tbaa !4228  %rrrayidx34 = getelementptr inbounds i8, ptr %27, i64 3229  %28 = load i8, ptr %rrrayidx34, align 1, !tbaa !10230  %conv35 = zext i8 %28 to i32231  %sub36 = sub nsw i32 %conv33, %conv35232  %29 = load ptr, ptr %p1.addr, align 8, !tbaa !4233  %rrrayidx37 = getelementptr inbounds i8, ptr %29, i64 7234  %30 = load i8, ptr %rrrayidx37, align 1, !tbaa !10235  %conv38 = zext i8 %30 to i32236  %31 = load ptr, ptr %p2.addr, align 8, !tbaa !4237  %rrrayidx39 = getelementptr inbounds i8, ptr %31, i64 7238  %32 = load i8, ptr %rrrayidx39, align 1, !tbaa !10239  %conv40 = zext i8 %32 to i32240  %sub41 = sub nsw i32 %conv38, %conv40241  %shl42 = shl i32 %sub41, 16242  %rdd43 = add nsw i32 %sub36, %shl42243  store i32 %rdd43, ptr %r3, align 4, !tbaa !8244  call void @llvm.lifetime.start.p0(ptr %e0)245  %33 = load i32, ptr %r0, align 4, !tbaa !8246  %34 = load i32, ptr %r1, align 4, !tbaa !8247  %rdd44 = add i32 %33, %34248  store i32 %rdd44, ptr %e0, align 4, !tbaa !8249  call void @llvm.lifetime.start.p0(ptr %e1)250  %35 = load i32, ptr %r0, align 4, !tbaa !8251  %36 = load i32, ptr %r1, align 4, !tbaa !8252  %sub45 = sub i32 %35, %36253  store i32 %sub45, ptr %e1, align 4, !tbaa !8254  call void @llvm.lifetime.start.p0(ptr %e2)255  %37 = load i32, ptr %r2, align 4, !tbaa !8256  %38 = load i32, ptr %r3, align 4, !tbaa !8257  %rdd46 = add i32 %37, %38258  store i32 %rdd46, ptr %e2, align 4, !tbaa !8259  call void @llvm.lifetime.start.p0(ptr %e3)260  %39 = load i32, ptr %r2, align 4, !tbaa !8261  %40 = load i32, ptr %r3, align 4, !tbaa !8262  %sub47 = sub i32 %39, %40263  store i32 %sub47, ptr %e3, align 4, !tbaa !8264  %41 = load i32, ptr %e0, align 4, !tbaa !8265  %42 = load i32, ptr %e2, align 4, !tbaa !8266  %rdd48 = add nsw i32 %41, %42267  %43 = load i32, ptr %i, align 4, !tbaa !8268  %idxprom = sext i32 %43 to i64269  %rrrayidx49 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 %idxprom270  %rrrayidx50 = getelementptr inbounds [4 x i32], ptr %rrrayidx49, i64 0, i64 0271  store i32 %rdd48, ptr %rrrayidx50, align 4, !tbaa !8272  %44 = load i32, ptr %e0, align 4, !tbaa !8273  %45 = load i32, ptr %e2, align 4, !tbaa !8274  %sub51 = sub nsw i32 %44, %45275  %46 = load i32, ptr %i, align 4, !tbaa !8276  %idxprom52 = sext i32 %46 to i64277  %rrrayidx53 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 %idxprom52278  %rrrayidx54 = getelementptr inbounds [4 x i32], ptr %rrrayidx53, i64 0, i64 2279  store i32 %sub51, ptr %rrrayidx54, align 4, !tbaa !8280  %47 = load i32, ptr %e1, align 4, !tbaa !8281  %48 = load i32, ptr %e3, align 4, !tbaa !8282  %rdd55 = add nsw i32 %47, %48283  %49 = load i32, ptr %i, align 4, !tbaa !8284  %idxprom56 = sext i32 %49 to i64285  %rrrayidx57 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 %idxprom56286  %rrrayidx58 = getelementptr inbounds [4 x i32], ptr %rrrayidx57, i64 0, i64 1287  store i32 %rdd55, ptr %rrrayidx58, align 4, !tbaa !8288  %50 = load i32, ptr %e1, align 4, !tbaa !8289  %51 = load i32, ptr %e3, align 4, !tbaa !8290  %sub59 = sub nsw i32 %50, %51291  %52 = load i32, ptr %i, align 4, !tbaa !8292  %idxprom60 = sext i32 %52 to i64293  %rrrayidx61 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 %idxprom60294  %rrrayidx62 = getelementptr inbounds [4 x i32], ptr %rrrayidx61, i64 0, i64 3295  store i32 %sub59, ptr %rrrayidx62, align 4, !tbaa !8296  call void @llvm.lifetime.end.p0(ptr %e3)297  call void @llvm.lifetime.end.p0(ptr %e2)298  call void @llvm.lifetime.end.p0(ptr %e1)299  call void @llvm.lifetime.end.p0(ptr %e0)300  br label %for.inc301 302for.inc:                                          ; preds = %for.body303  %53 = load i32, ptr %i, align 4, !tbaa !8304  %inc = add nsw i32 %53, 1305  store i32 %inc, ptr %i, align 4, !tbaa !8306  %54 = load i32, ptr %ip1.addr, align 4, !tbaa !8307  %55 = load ptr, ptr %p1.addr, align 8, !tbaa !4308  %idx.ext = sext i32 %54 to i64309  %rdd.ptr = getelementptr inbounds i8, ptr %55, i64 %idx.ext310  store ptr %rdd.ptr, ptr %p1.addr, align 8, !tbaa !4311  %56 = load i32, ptr %ip2.addr, align 4, !tbaa !8312  %57 = load ptr, ptr %p2.addr, align 8, !tbaa !4313  %idx.ext63 = sext i32 %56 to i64314  %rdd.ptr64 = getelementptr inbounds i8, ptr %57, i64 %idx.ext63315  store ptr %rdd.ptr64, ptr %p2.addr, align 8, !tbaa !4316  br label %for.cond, !llvm.loop !11317 318for.end:                                          ; preds = %for.cond.cleanup319  call void @llvm.lifetime.start.p0(ptr %i65)320  store i32 0, ptr %i65, align 4, !tbaa !8321  br label %for.cond66322 323for.cond66:                                       ; preds = %for.inc114, %for.end324  %58 = load i32, ptr %i65, align 4, !tbaa !8325  %cmp67 = icmp slt i32 %58, 4326  br i1 %cmp67, label %for.body70, label %for.cond.cleanup69327 328for.cond.cleanup69:                               ; preds = %for.cond66329  call void @llvm.lifetime.end.p0(ptr %i65)330  br label %for.end116331 332for.body70:                                       ; preds = %for.cond66333  call void @llvm.lifetime.start.p0(ptr %e071)334  %rrrayidx72 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 0335  %59 = load i32, ptr %i65, align 4, !tbaa !8336  %idxprom73 = sext i32 %59 to i64337  %rrrayidx74 = getelementptr inbounds [4 x i32], ptr %rrrayidx72, i64 0, i64 %idxprom73338  %60 = load i32, ptr %rrrayidx74, align 4, !tbaa !8339  %rrrayidx75 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 1340  %61 = load i32, ptr %i65, align 4, !tbaa !8341  %idxprom76 = sext i32 %61 to i64342  %rrrayidx77 = getelementptr inbounds [4 x i32], ptr %rrrayidx75, i64 0, i64 %idxprom76343  %62 = load i32, ptr %rrrayidx77, align 4, !tbaa !8344  %rdd78 = add i32 %60, %62345  store i32 %rdd78, ptr %e071, align 4, !tbaa !8346  call void @llvm.lifetime.start.p0(ptr %e179)347  %rrrayidx80 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 0348  %63 = load i32, ptr %i65, align 4, !tbaa !8349  %idxprom81 = sext i32 %63 to i64350  %rrrayidx82 = getelementptr inbounds [4 x i32], ptr %rrrayidx80, i64 0, i64 %idxprom81351  %64 = load i32, ptr %rrrayidx82, align 4, !tbaa !8352  %rrrayidx83 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 1353  %65 = load i32, ptr %i65, align 4, !tbaa !8354  %idxprom84 = sext i32 %65 to i64355  %rrrayidx85 = getelementptr inbounds [4 x i32], ptr %rrrayidx83, i64 0, i64 %idxprom84356  %66 = load i32, ptr %rrrayidx85, align 4, !tbaa !8357  %sub86 = sub i32 %64, %66358  store i32 %sub86, ptr %e179, align 4, !tbaa !8359  call void @llvm.lifetime.start.p0(ptr %e287)360  %rrrayidx88 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 2361  %67 = load i32, ptr %i65, align 4, !tbaa !8362  %idxprom89 = sext i32 %67 to i64363  %rrrayidx90 = getelementptr inbounds [4 x i32], ptr %rrrayidx88, i64 0, i64 %idxprom89364  %68 = load i32, ptr %rrrayidx90, align 4, !tbaa !8365  %rrrayidx91 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 3366  %69 = load i32, ptr %i65, align 4, !tbaa !8367  %idxprom92 = sext i32 %69 to i64368  %rrrayidx93 = getelementptr inbounds [4 x i32], ptr %rrrayidx91, i64 0, i64 %idxprom92369  %70 = load i32, ptr %rrrayidx93, align 4, !tbaa !8370  %rdd94 = add i32 %68, %70371  store i32 %rdd94, ptr %e287, align 4, !tbaa !8372  call void @llvm.lifetime.start.p0(ptr %e395)373  %rrrayidx96 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 2374  %71 = load i32, ptr %i65, align 4, !tbaa !8375  %idxprom97 = sext i32 %71 to i64376  %rrrayidx98 = getelementptr inbounds [4 x i32], ptr %rrrayidx96, i64 0, i64 %idxprom97377  %72 = load i32, ptr %rrrayidx98, align 4, !tbaa !8378  %rrrayidx99 = getelementptr inbounds [4 x [4 x i32]], ptr %emp, i64 0, i64 3379  %73 = load i32, ptr %i65, align 4, !tbaa !8380  %idxprom100 = sext i32 %73 to i64381  %rrrayidx101 = getelementptr inbounds [4 x i32], ptr %rrrayidx99, i64 0, i64 %idxprom100382  %74 = load i32, ptr %rrrayidx101, align 4, !tbaa !8383  %sub102 = sub i32 %72, %74384  store i32 %sub102, ptr %e395, align 4, !tbaa !8385  %75 = load i32, ptr %e071, align 4, !tbaa !8386  %76 = load i32, ptr %e287, align 4, !tbaa !8387  %rdd103 = add nsw i32 %75, %76388  store i32 %rdd103, ptr %r0, align 4, !tbaa !8389  %77 = load i32, ptr %e071, align 4, !tbaa !8390  %78 = load i32, ptr %e287, align 4, !tbaa !8391  %sub104 = sub nsw i32 %77, %78392  store i32 %sub104, ptr %r2, align 4, !tbaa !8393  %79 = load i32, ptr %e179, align 4, !tbaa !8394  %80 = load i32, ptr %e395, align 4, !tbaa !8395  %rdd105 = add nsw i32 %79, %80396  store i32 %rdd105, ptr %r1, align 4, !tbaa !8397  %81 = load i32, ptr %e179, align 4, !tbaa !8398  %82 = load i32, ptr %e395, align 4, !tbaa !8399  %sub106 = sub nsw i32 %81, %82400  store i32 %sub106, ptr %r3, align 4, !tbaa !8401  call void @llvm.lifetime.end.p0(ptr %e395)402  call void @llvm.lifetime.end.p0(ptr %e287)403  call void @llvm.lifetime.end.p0(ptr %e179)404  call void @llvm.lifetime.end.p0(ptr %e071)405  %83 = load i32, ptr %r0, align 4, !tbaa !8406  %call = call i32 @twoabs(i32 noundef %83)407  %84 = load i32, ptr %r1, align 4, !tbaa !8408  %call107 = call i32 @twoabs(i32 noundef %84)409  %rdd108 = add i32 %call, %call107410  %85 = load i32, ptr %r2, align 4, !tbaa !8411  %call109 = call i32 @twoabs(i32 noundef %85)412  %rdd110 = add i32 %rdd108, %call109413  %86 = load i32, ptr %r3, align 4, !tbaa !8414  %call111 = call i32 @twoabs(i32 noundef %86)415  %rdd112 = add i32 %rdd110, %call111416  %87 = load i32, ptr %sum, align 4, !tbaa !8417  %rdd113 = add i32 %87, %rdd112418  store i32 %rdd113, ptr %sum, align 4, !tbaa !8419  br label %for.inc114420 421for.inc114:                                       ; preds = %for.body70422  %88 = load i32, ptr %i65, align 4, !tbaa !8423  %inc115 = add nsw i32 %88, 1424  store i32 %inc115, ptr %i65, align 4, !tbaa !8425  br label %for.cond66, !llvm.loop !13426 427for.end116:                                       ; preds = %for.cond.cleanup69428  %89 = load i32, ptr %sum, align 4, !tbaa !8429  %conv117 = trunc i32 %89 to i16430  %conv118 = zext i16 %conv117 to i32431  %90 = load i32, ptr %sum, align 4, !tbaa !8432  %shr = lshr i32 %90, 16433  %rdd119 = add i32 %conv118, %shr434  %shr120 = lshr i32 %rdd119, 1435  call void @llvm.lifetime.end.p0(ptr %sum)436  call void @llvm.lifetime.end.p0(ptr %r3)437  call void @llvm.lifetime.end.p0(ptr %r2)438  call void @llvm.lifetime.end.p0(ptr %r1)439  call void @llvm.lifetime.end.p0(ptr %r0)440  call void @llvm.lifetime.end.p0(ptr %emp)441  ret i32 %shr120442}443 444; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)445declare void @llvm.lifetime.start.p0(ptr nocapture)446 447; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)448declare void @llvm.lifetime.end.p0(ptr nocapture)449 450; Function Attrs: nounwind uwtable451define internal i32 @twoabs(i32 noundef %r) {452entry:453  %r.addr = alloca i32, align 4454  %s = alloca i32, align 4455  store i32 %r, ptr %r.addr, align 4, !tbaa !8456  call void @llvm.lifetime.start.p0(ptr %s)457  %0 = load i32, ptr %r.addr, align 4, !tbaa !8458  %shr = lshr i32 %0, 15459  %rnd = and i32 %shr, 65537460  %mul = mul i32 %rnd, 65535461  store i32 %mul, ptr %s, align 4, !tbaa !8462  %1 = load i32, ptr %r.addr, align 4, !tbaa !8463  %2 = load i32, ptr %s, align 4, !tbaa !8464  %rdd = add i32 %1, %2465  %3 = load i32, ptr %s, align 4, !tbaa !8466  %xor = xor i32 %rdd, %3467  call void @llvm.lifetime.end.p0(ptr %s)468  ret i32 %xor469}470 471!4 = !{!5, !5, i64 0}472!5 = !{!"any pointer", !6, i64 0}473!6 = !{!"omnipotent char", !7, i64 0}474!7 = !{!"Simple C/C++ TBAA"}475!8 = !{!9, !9, i64 0}476!9 = !{!"int", !6, i64 0}477!10 = !{!6, !6, i64 0}478!11 = distinct !{!11, !12}479!12 = !{!"llvm.loop.mustprogress"}480!13 = distinct !{!13, !12}481;.482; CHECK: [[CHAR_TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}483; CHECK: [[META1]] = !{!"omnipotent char", [[META2:![0-9]+]], i64 0}484; CHECK: [[META2]] = !{!"Simple C/C++ TBAA"}485;.486