; Test that adjustSubwordCmp() maintains the chains properly when creating a
; new extending load.
;
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 -O3 | FileCheck %s
@g_56 = external hidden unnamed_addr global i64, align 8
@func_22.l_91 = external hidden unnamed_addr constant [4 x [7 x ptr]], align 8
@g_102 = external hidden unnamed_addr global ptr, align 8
@.str = external hidden unnamed_addr constant [2 x i8], align 2
@.str.1 = external hidden unnamed_addr constant [15 x i8], align 2
@crc32_context = external hidden unnamed_addr global i32, align 4
@crc32_tab = external hidden unnamed_addr global [256 x i32], align 4
@.str.2 = external hidden unnamed_addr constant [36 x i8], align 2
@.str.3 = external hidden unnamed_addr constant [15 x i8], align 2
@g_181.0.4.5 = external hidden unnamed_addr global i1, align 2
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #0
; Function Attrs: argmemonly nounwind
declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1) #0
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #0
; Function Attrs: nounwind
define signext i32 @main(i32 signext, ptr nocapture readonly) local_unnamed_addr #1 {
%3 = alloca [4 x [7 x ptr]], align 8
%4 = icmp eq i32 %0, 2
br i1 %4, label %5, label %11
; <label>:5: ; preds = %2
%6 = getelementptr inbounds ptr, ptr %1, i64 1
%7 = load ptr, ptr %6, align 8
%8 = tail call signext i32 @strcmp(ptr %7, ptr @.str) #4
%9 = icmp eq i32 %8, 0
%10 = zext i1 %9 to i32
br label %11
; <label>:11: ; preds = %5, %2
%12 = phi i32 [ 0, %2 ], [ %10, %5 ]
br label %13
; <label>:13: ; preds = %13, %11
%14 = phi i64 [ 0, %11 ], [ %58, %13 ]
%15 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %11 ], [ %59, %13 ]
%16 = and <4 x i32> %15, <i32 1, i32 1, i32 1, i32 1>
%17 = icmp eq <4 x i32> %16, zeroinitializer
%18 = lshr <4 x i32> %15, <i32 1, i32 1, i32 1, i32 1>
%19 = xor <4 x i32> %18, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%20 = select <4 x i1> %17, <4 x i32> %18, <4 x i32> %19
%21 = and <4 x i32> %20, <i32 1, i32 1, i32 1, i32 1>
%22 = icmp eq <4 x i32> %21, zeroinitializer
%23 = lshr <4 x i32> %20, <i32 1, i32 1, i32 1, i32 1>
%24 = xor <4 x i32> %23, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%25 = select <4 x i1> %22, <4 x i32> %23, <4 x i32> %24
%26 = and <4 x i32> %25, <i32 1, i32 1, i32 1, i32 1>
%27 = icmp eq <4 x i32> %26, zeroinitializer
%28 = lshr <4 x i32> %25, <i32 1, i32 1, i32 1, i32 1>
%29 = xor <4 x i32> %28, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%30 = select <4 x i1> %27, <4 x i32> %28, <4 x i32> %29
%31 = and <4 x i32> %30, <i32 1, i32 1, i32 1, i32 1>
%32 = icmp eq <4 x i32> %31, zeroinitializer
%33 = lshr <4 x i32> %30, <i32 1, i32 1, i32 1, i32 1>
%34 = xor <4 x i32> %33, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%35 = select <4 x i1> %32, <4 x i32> %33, <4 x i32> %34
%36 = and <4 x i32> %35, <i32 1, i32 1, i32 1, i32 1>
%37 = icmp eq <4 x i32> %36, zeroinitializer
%38 = lshr <4 x i32> %35, <i32 1, i32 1, i32 1, i32 1>
%39 = xor <4 x i32> %38, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%40 = select <4 x i1> %37, <4 x i32> %38, <4 x i32> %39
%41 = and <4 x i32> %40, <i32 1, i32 1, i32 1, i32 1>
%42 = icmp eq <4 x i32> %41, zeroinitializer
%43 = lshr <4 x i32> %40, <i32 1, i32 1, i32 1, i32 1>
%44 = xor <4 x i32> %43, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%45 = select <4 x i1> %42, <4 x i32> %43, <4 x i32> %44
%46 = and <4 x i32> %45, <i32 1, i32 1, i32 1, i32 1>
%47 = icmp eq <4 x i32> %46, zeroinitializer
%48 = lshr <4 x i32> %45, <i32 1, i32 1, i32 1, i32 1>
%49 = xor <4 x i32> %48, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%50 = select <4 x i1> %47, <4 x i32> %48, <4 x i32> %49
%51 = and <4 x i32> %50, <i32 1, i32 1, i32 1, i32 1>
%52 = icmp eq <4 x i32> %51, zeroinitializer
%53 = lshr <4 x i32> %50, <i32 1, i32 1, i32 1, i32 1>
%54 = xor <4 x i32> %53, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%55 = select <4 x i1> %52, <4 x i32> %53, <4 x i32> %54
%56 = getelementptr inbounds [256 x i32], ptr @crc32_tab, i64 0, i64 %14
%57 = bitcast ptr %56 to ptr
store <4 x i32> %55, ptr %57, align 4
%58 = add i64 %14, 4
%59 = add <4 x i32> %15, <i32 4, i32 4, i32 4, i32 4>
%60 = icmp eq i64 %58, 256
br i1 %60, label %61, label %13
; <label>:61: ; preds = %13
; CHECK-LABEL: %bb.6:
; CHECK: stgrl %r0, g_56
; CHECK: llhrl %r0, g_56+6
; CHECK: stgrl %r2, g_56
store i64 0, ptr @g_56, align 8
%62 = bitcast ptr %3 to ptr
call void @llvm.lifetime.start.p0(i64 224, ptr nonnull %62) #5
call void @llvm.memcpy.p0.p0.i64(ptr align 8 nonnull %62, ptr align 8 @func_22.l_91, i64 224, i1 false) #5
%63 = getelementptr inbounds [4 x [7 x ptr]], ptr %3, i64 0, i64 0, i64 2
store ptr %63, ptr @g_102, align 8
%64 = load i64, ptr @g_56, align 8
store i64 2, ptr @g_56, align 8
%65 = and i64 %64, 65535
%66 = icmp eq i64 %65, 0
br i1 %66, label %68, label %67
; <label>:67: ; preds = %61
store i1 true, ptr @g_181.0.4.5, align 2
br label %68
; <label>:68: ; preds = %67, %61
call void @llvm.lifetime.end.p0(i64 224, ptr nonnull %62) #5
%69 = load i1, ptr @g_181.0.4.5, align 2
%70 = select i1 %69, i32 0, i32 72
%71 = load i32, ptr @crc32_context, align 4
%72 = lshr i32 %71, 8
%73 = and i32 %71, 255
%74 = xor i32 %73, %70
%75 = zext i32 %74 to i64
%76 = getelementptr inbounds [256 x i32], ptr @crc32_tab, i64 0, i64 %75
%77 = load i32, ptr %76, align 4
%78 = xor i32 %72, %77
%79 = lshr i32 %78, 8
%80 = and i32 %78, 255
%81 = zext i32 %80 to i64
%82 = getelementptr inbounds [256 x i32], ptr @crc32_tab, i64 0, i64 %81
%83 = load i32, ptr %82, align 4
%84 = xor i32 %79, %83
%85 = lshr i32 %84, 8
%86 = and i32 %84, 255
%87 = zext i32 %86 to i64
%88 = getelementptr inbounds [256 x i32], ptr @crc32_tab, i64 0, i64 %87
%89 = load i32, ptr %88, align 4
%90 = xor i32 %85, %89
%91 = lshr i32 %90, 8
%92 = and i32 %90, 255
%93 = zext i32 %92 to i64
%94 = getelementptr inbounds [256 x i32], ptr @crc32_tab, i64 0, i64 %93
%95 = load i32, ptr %94, align 4
%96 = xor i32 %91, %95
%97 = lshr i32 %96, 8
%98 = and i32 %96, 255
%99 = zext i32 %98 to i64
%100 = getelementptr inbounds [256 x i32], ptr @crc32_tab, i64 0, i64 %99
%101 = load i32, ptr %100, align 4
%102 = xor i32 %97, %101
%103 = lshr i32 %102, 8
%104 = and i32 %102, 255
%105 = zext i32 %104 to i64
%106 = getelementptr inbounds [256 x i32], ptr @crc32_tab, i64 0, i64 %105
%107 = load i32, ptr %106, align 4
%108 = xor i32 %103, %107
%109 = lshr i32 %108, 8
%110 = and i32 %108, 255
%111 = zext i32 %110 to i64
%112 = getelementptr inbounds [256 x i32], ptr @crc32_tab, i64 0, i64 %111
%113 = load i32, ptr %112, align 4
%114 = xor i32 %109, %113
%115 = lshr i32 %114, 8
%116 = and i32 %114, 255
%117 = zext i32 %116 to i64
%118 = getelementptr inbounds [256 x i32], ptr @crc32_tab, i64 0, i64 %117
%119 = load i32, ptr %118, align 4
%120 = xor i32 %115, %119
store i32 %120, ptr @crc32_context, align 4
%121 = icmp eq i32 %12, 0
br i1 %121, label %127, label %122
; <label>:122: ; preds = %68
%123 = xor i32 %120, -1
%124 = zext i32 %123 to i64
%125 = call signext i32 (ptr, ...) @printf(ptr @.str.2, ptr @.str.1, i64 %124) #5
%126 = load i32, ptr @crc32_context, align 4
br label %127
; <label>:127: ; preds = %122, %68
%128 = phi i32 [ %120, %68 ], [ %126, %122 ]
%129 = xor i32 %128, -1
%130 = call signext i32 (ptr, ...) @printf(ptr @.str.3, i32 zeroext %129) #5
ret i32 0
}
; Function Attrs: nounwind readonly
declare signext i32 @strcmp(ptr nocapture, ptr nocapture) local_unnamed_addr #2
; Function Attrs: nounwind
declare signext i32 @printf(ptr nocapture readonly, ...) local_unnamed_addr #3