Home | History | Annotate | Download | only in SystemZ
      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
     18 declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #0
     19 
     20 ; Function Attrs: argmemonly nounwind
     21 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #0
     22 
     23 ; Function Attrs: argmemonly nounwind
     24 declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #0
     25 
     26 ; Function Attrs: nounwind
     27 define 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
    189 declare signext i32 @strcmp(i8* nocapture, i8* nocapture) local_unnamed_addr #2
    190 
    191 ; Function Attrs: nounwind
    192 declare signext i32 @printf(i8* nocapture readonly, ...) local_unnamed_addr #3
    193