193 lines
8.6 KiB
LLVM
193 lines
8.6 KiB
LLVM
; 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 i16*]], align 8
|
|
@g_102 = external hidden unnamed_addr global i16**, 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.p0i8(i64, i8* nocapture) #0
|
|
|
|
; Function Attrs: argmemonly nounwind
|
|
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #0
|
|
|
|
; Function Attrs: argmemonly nounwind
|
|
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #0
|
|
|
|
; Function Attrs: nounwind
|
|
define signext i32 @main(i32 signext, i8** nocapture readonly) local_unnamed_addr #1 {
|
|
%3 = alloca [4 x [7 x i16*]], align 8
|
|
%4 = icmp eq i32 %0, 2
|
|
br i1 %4, label %5, label %11
|
|
|
|
; <label>:5: ; preds = %2
|
|
%6 = getelementptr inbounds i8*, i8** %1, i64 1
|
|
%7 = load i8*, i8** %6, align 8
|
|
%8 = tail call signext i32 @strcmp(i8* %7, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0)) #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], [256 x i32]* @crc32_tab, i64 0, i64 %14
|
|
%57 = bitcast i32* %56 to <4 x i32>*
|
|
store <4 x i32> %55, <4 x i32>* %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, i64* @g_56, align 8
|
|
%62 = bitcast [4 x [7 x i16*]]* %3 to i8*
|
|
call void @llvm.lifetime.start.p0i8(i64 224, i8* nonnull %62) #5
|
|
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
|
|
%63 = getelementptr inbounds [4 x [7 x i16*]], [4 x [7 x i16*]]* %3, i64 0, i64 0, i64 2
|
|
store i16** %63, i16*** @g_102, align 8
|
|
%64 = load i64, i64* @g_56, align 8
|
|
store i64 2, i64* @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, i1* @g_181.0.4.5, align 2
|
|
br label %68
|
|
|
|
; <label>:68: ; preds = %67, %61
|
|
call void @llvm.lifetime.end.p0i8(i64 224, i8* nonnull %62) #5
|
|
%69 = load i1, i1* @g_181.0.4.5, align 2
|
|
%70 = select i1 %69, i32 0, i32 72
|
|
%71 = load i32, i32* @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], [256 x i32]* @crc32_tab, i64 0, i64 %75
|
|
%77 = load i32, i32* %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], [256 x i32]* @crc32_tab, i64 0, i64 %81
|
|
%83 = load i32, i32* %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], [256 x i32]* @crc32_tab, i64 0, i64 %87
|
|
%89 = load i32, i32* %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], [256 x i32]* @crc32_tab, i64 0, i64 %93
|
|
%95 = load i32, i32* %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], [256 x i32]* @crc32_tab, i64 0, i64 %99
|
|
%101 = load i32, i32* %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], [256 x i32]* @crc32_tab, i64 0, i64 %105
|
|
%107 = load i32, i32* %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], [256 x i32]* @crc32_tab, i64 0, i64 %111
|
|
%113 = load i32, i32* %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], [256 x i32]* @crc32_tab, i64 0, i64 %117
|
|
%119 = load i32, i32* %118, align 4
|
|
%120 = xor i32 %115, %119
|
|
store i32 %120, i32* @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 (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
|
|
%126 = load i32, i32* @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 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0), i32 zeroext %129) #5
|
|
ret i32 0
|
|
}
|
|
|
|
; Function Attrs: nounwind readonly
|
|
declare signext i32 @strcmp(i8* nocapture, i8* nocapture) local_unnamed_addr #2
|
|
|
|
; Function Attrs: nounwind
|
|
declare signext i32 @printf(i8* nocapture readonly, ...) local_unnamed_addr #3
|