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