1; Test that adjustSubwordCmp() maintains the chains properly when creating a 2; new extending load. 3; 4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 -O3 | FileCheck %s 5 6@g_56 = external hidden unnamed_addr global i64, align 8 7@func_22.l_91 = external hidden unnamed_addr constant [4 x [7 x i16*]], align 8 8@g_102 = external hidden unnamed_addr global i16**, align 8 9@.str = external hidden unnamed_addr constant [2 x i8], align 2 10@.str.1 = external hidden unnamed_addr constant [15 x i8], align 2 11@crc32_context = external hidden unnamed_addr global i32, align 4 12@crc32_tab = external hidden unnamed_addr global [256 x i32], align 4 13@.str.2 = external hidden unnamed_addr constant [36 x i8], align 2 14@.str.3 = external hidden unnamed_addr constant [15 x i8], align 2 15@g_181.0.4.5 = external hidden unnamed_addr global i1, align 2 16 17; Function Attrs: argmemonly nounwind 18declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #0 19 20; Function Attrs: argmemonly nounwind 21declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #0 22 23; Function Attrs: argmemonly nounwind 24declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #0 25 26; Function Attrs: nounwind 27define signext i32 @main(i32 signext, i8** nocapture readonly) local_unnamed_addr #1 { 28 %3 = alloca [4 x [7 x i16*]], align 8 29 %4 = icmp eq i32 %0, 2 30 br i1 %4, label %5, label %11 31 32; <label>:5: ; preds = %2 33 %6 = getelementptr inbounds i8*, i8** %1, i64 1 34 %7 = load i8*, i8** %6, align 8 35 %8 = tail call signext i32 @strcmp(i8* %7, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0)) #4 36 %9 = icmp eq i32 %8, 0 37 %10 = zext i1 %9 to i32 38 br label %11 39 40; <label>:11: ; preds = %5, %2 41 %12 = phi i32 [ 0, %2 ], [ %10, %5 ] 42 br label %13 43 44; <label>:13: ; preds = %13, %11 45 %14 = phi i64 [ 0, %11 ], [ %58, %13 ] 46 %15 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %11 ], [ %59, %13 ] 47 %16 = and <4 x i32> %15, <i32 1, i32 1, i32 1, i32 1> 48 %17 = icmp eq <4 x i32> %16, zeroinitializer 49 %18 = lshr <4 x i32> %15, <i32 1, i32 1, i32 1, i32 1> 50 %19 = xor <4 x i32> %18, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912> 51 %20 = select <4 x i1> %17, <4 x i32> %18, <4 x i32> %19 52 %21 = and <4 x i32> %20, <i32 1, i32 1, i32 1, i32 1> 53 %22 = icmp eq <4 x i32> %21, zeroinitializer 54 %23 = lshr <4 x i32> %20, <i32 1, i32 1, i32 1, i32 1> 55 %24 = xor <4 x i32> %23, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912> 56 %25 = select <4 x i1> %22, <4 x i32> %23, <4 x i32> %24 57 %26 = and <4 x i32> %25, <i32 1, i32 1, i32 1, i32 1> 58 %27 = icmp eq <4 x i32> %26, zeroinitializer 59 %28 = lshr <4 x i32> %25, <i32 1, i32 1, i32 1, i32 1> 60 %29 = xor <4 x i32> %28, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912> 61 %30 = select <4 x i1> %27, <4 x i32> %28, <4 x i32> %29 62 %31 = and <4 x i32> %30, <i32 1, i32 1, i32 1, i32 1> 63 %32 = icmp eq <4 x i32> %31, zeroinitializer 64 %33 = lshr <4 x i32> %30, <i32 1, i32 1, i32 1, i32 1> 65 %34 = xor <4 x i32> %33, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912> 66 %35 = select <4 x i1> %32, <4 x i32> %33, <4 x i32> %34 67 %36 = and <4 x i32> %35, <i32 1, i32 1, i32 1, i32 1> 68 %37 = icmp eq <4 x i32> %36, zeroinitializer 69 %38 = lshr <4 x i32> %35, <i32 1, i32 1, i32 1, i32 1> 70 %39 = xor <4 x i32> %38, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912> 71 %40 = select <4 x i1> %37, <4 x i32> %38, <4 x i32> %39 72 %41 = and <4 x i32> %40, <i32 1, i32 1, i32 1, i32 1> 73 %42 = icmp eq <4 x i32> %41, zeroinitializer 74 %43 = lshr <4 x i32> %40, <i32 1, i32 1, i32 1, i32 1> 75 %44 = xor <4 x i32> %43, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912> 76 %45 = select <4 x i1> %42, <4 x i32> %43, <4 x i32> %44 77 %46 = and <4 x i32> %45, <i32 1, i32 1, i32 1, i32 1> 78 %47 = icmp eq <4 x i32> %46, zeroinitializer 79 %48 = lshr <4 x i32> %45, <i32 1, i32 1, i32 1, i32 1> 80 %49 = xor <4 x i32> %48, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912> 81 %50 = select <4 x i1> %47, <4 x i32> %48, <4 x i32> %49 82 %51 = and <4 x i32> %50, <i32 1, i32 1, i32 1, i32 1> 83 %52 = icmp eq <4 x i32> %51, zeroinitializer 84 %53 = lshr <4 x i32> %50, <i32 1, i32 1, i32 1, i32 1> 85 %54 = xor <4 x i32> %53, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912> 86 %55 = select <4 x i1> %52, <4 x i32> %53, <4 x i32> %54 87 %56 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32_tab, i64 0, i64 %14 88 %57 = bitcast i32* %56 to <4 x i32>* 89 store <4 x i32> %55, <4 x i32>* %57, align 4 90 %58 = add i64 %14, 4 91 %59 = add <4 x i32> %15, <i32 4, i32 4, i32 4, i32 4> 92 %60 = icmp eq i64 %58, 256 93 br i1 %60, label %61, label %13 94 95; <label>:61: ; preds = %13 96; CHECK-LABEL: %bb.6: 97; CHECK: stgrl %r0, g_56 98; CHECK: llhrl %r0, g_56+6 99; CHECK: stgrl %r2, g_56 100 store i64 0, i64* @g_56, align 8 101 %62 = bitcast [4 x [7 x i16*]]* %3 to i8* 102 call void @llvm.lifetime.start.p0i8(i64 224, i8* nonnull %62) #5 103 call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 nonnull %62, i8* align 8 bitcast ([4 x [7 x i16*]]* @func_22.l_91 to i8*), i64 224, i1 false) #5 104 %63 = getelementptr inbounds [4 x [7 x i16*]], [4 x [7 x i16*]]* %3, i64 0, i64 0, i64 2 105 store i16** %63, i16*** @g_102, align 8 106 %64 = load i64, i64* @g_56, align 8 107 store i64 2, i64* @g_56, align 8 108 %65 = and i64 %64, 65535 109 %66 = icmp eq i64 %65, 0 110 br i1 %66, label %68, label %67 111 112; <label>:67: ; preds = %61 113 store i1 true, i1* @g_181.0.4.5, align 2 114 br label %68 115 116; <label>:68: ; preds = %67, %61 117 call void @llvm.lifetime.end.p0i8(i64 224, i8* nonnull %62) #5 118 %69 = load i1, i1* @g_181.0.4.5, align 2 119 %70 = select i1 %69, i32 0, i32 72 120 %71 = load i32, i32* @crc32_context, align 4 121 %72 = lshr i32 %71, 8 122 %73 = and i32 %71, 255 123 %74 = xor i32 %73, %70 124 %75 = zext i32 %74 to i64 125 %76 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32_tab, i64 0, i64 %75 126 %77 = load i32, i32* %76, align 4 127 %78 = xor i32 %72, %77 128 %79 = lshr i32 %78, 8 129 %80 = and i32 %78, 255 130 %81 = zext i32 %80 to i64 131 %82 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32_tab, i64 0, i64 %81 132 %83 = load i32, i32* %82, align 4 133 %84 = xor i32 %79, %83 134 %85 = lshr i32 %84, 8 135 %86 = and i32 %84, 255 136 %87 = zext i32 %86 to i64 137 %88 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32_tab, i64 0, i64 %87 138 %89 = load i32, i32* %88, align 4 139 %90 = xor i32 %85, %89 140 %91 = lshr i32 %90, 8 141 %92 = and i32 %90, 255 142 %93 = zext i32 %92 to i64 143 %94 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32_tab, i64 0, i64 %93 144 %95 = load i32, i32* %94, align 4 145 %96 = xor i32 %91, %95 146 %97 = lshr i32 %96, 8 147 %98 = and i32 %96, 255 148 %99 = zext i32 %98 to i64 149 %100 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32_tab, i64 0, i64 %99 150 %101 = load i32, i32* %100, align 4 151 %102 = xor i32 %97, %101 152 %103 = lshr i32 %102, 8 153 %104 = and i32 %102, 255 154 %105 = zext i32 %104 to i64 155 %106 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32_tab, i64 0, i64 %105 156 %107 = load i32, i32* %106, align 4 157 %108 = xor i32 %103, %107 158 %109 = lshr i32 %108, 8 159 %110 = and i32 %108, 255 160 %111 = zext i32 %110 to i64 161 %112 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32_tab, i64 0, i64 %111 162 %113 = load i32, i32* %112, align 4 163 %114 = xor i32 %109, %113 164 %115 = lshr i32 %114, 8 165 %116 = and i32 %114, 255 166 %117 = zext i32 %116 to i64 167 %118 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32_tab, i64 0, i64 %117 168 %119 = load i32, i32* %118, align 4 169 %120 = xor i32 %115, %119 170 store i32 %120, i32* @crc32_context, align 4 171 %121 = icmp eq i32 %12, 0 172 br i1 %121, label %127, label %122 173 174; <label>:122: ; preds = %68 175 %123 = xor i32 %120, -1 176 %124 = zext i32 %123 to i64 177 %125 = call signext i32 (i8*, ...) @printf(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0), i64 %124) #5 178 %126 = load i32, i32* @crc32_context, align 4 179 br label %127 180 181; <label>:127: ; preds = %122, %68 182 %128 = phi i32 [ %120, %68 ], [ %126, %122 ] 183 %129 = xor i32 %128, -1 184 %130 = call signext i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0), i32 zeroext %129) #5 185 ret i32 0 186} 187 188; Function Attrs: nounwind readonly 189declare signext i32 @strcmp(i8* nocapture, i8* nocapture) local_unnamed_addr #2 190 191; Function Attrs: nounwind 192declare signext i32 @printf(i8* nocapture readonly, ...) local_unnamed_addr #3 193