|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| 2 | +; RUN: opt < %s -O3 -S | FileCheck %s |
| 3 | +; RUN: opt < %s -passes="default<O3>" -S | FileCheck %s |
| 4 | + |
| 5 | +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| 6 | +target triple = "x86_64-pc-linux-gnu" |
| 7 | + |
| 8 | +%t0 = type { ptr, ptr } |
| 9 | +%t1 = type { [16 x i32] } |
| 10 | +%t2 = type { %t3, ptr } |
| 11 | +%t3 = type { i8 } |
| 12 | + |
| 13 | +define void @wibble(ptr %arg) personality ptr null { |
| 14 | +; CHECK-LABEL: @wibble( |
| 15 | +; CHECK-NEXT: bb: |
| 16 | +; CHECK-NEXT: [[I1:%.*]] = alloca [[T1:%.*]], align 16 |
| 17 | +; CHECK-NEXT: [[I10_3_I_PRE:%.*]] = load i8, ptr [[ARG:%.*]], align 1 |
| 18 | +; CHECK-NEXT: [[VECTOR_RECUR_INIT:%.*]] = insertelement <4 x i8> poison, i8 [[I10_3_I_PRE]], i64 3 |
| 19 | +; CHECK-NEXT: [[TMP0:%.*]] = getelementptr [64 x i8], ptr [[ARG]], i64 0, i64 1 |
| 20 | +; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP0]], align 1 |
| 21 | +; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i8> [[VECTOR_RECUR_INIT]], <4 x i8> [[WIDE_LOAD]], <4 x i32> <i32 3, i32 4, i32 5, i32 6> |
| 22 | +; CHECK-NEXT: [[TMP2:%.*]] = or <4 x i8> [[TMP1]], <i8 1, i8 1, i8 1, i8 1> |
| 23 | +; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i8> [[TMP2]] to <4 x i32> |
| 24 | +; CHECK-NEXT: store <4 x i32> [[TMP3]], ptr [[I1]], align 16 |
| 25 | +; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [16 x i32], ptr [[I1]], i64 0, i64 4 |
| 26 | +; CHECK-NEXT: [[TMP5:%.*]] = getelementptr [64 x i8], ptr [[ARG]], i64 0, i64 5 |
| 27 | +; CHECK-NEXT: [[WIDE_LOAD_1:%.*]] = load <4 x i8>, ptr [[TMP5]], align 1 |
| 28 | +; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <4 x i8> [[WIDE_LOAD]], <4 x i8> [[WIDE_LOAD_1]], <4 x i32> <i32 3, i32 4, i32 5, i32 6> |
| 29 | +; CHECK-NEXT: [[TMP7:%.*]] = or <4 x i8> [[TMP6]], <i8 1, i8 1, i8 1, i8 1> |
| 30 | +; CHECK-NEXT: [[TMP8:%.*]] = zext <4 x i8> [[TMP7]] to <4 x i32> |
| 31 | +; CHECK-NEXT: store <4 x i32> [[TMP8]], ptr [[TMP4]], align 16 |
| 32 | +; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds [16 x i32], ptr [[I1]], i64 0, i64 8 |
| 33 | +; CHECK-NEXT: [[TMP10:%.*]] = getelementptr [64 x i8], ptr [[ARG]], i64 0, i64 9 |
| 34 | +; CHECK-NEXT: [[WIDE_LOAD_2:%.*]] = load <4 x i8>, ptr [[TMP10]], align 1 |
| 35 | +; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <4 x i8> [[WIDE_LOAD_1]], <4 x i8> [[WIDE_LOAD_2]], <4 x i32> <i32 3, i32 4, i32 5, i32 6> |
| 36 | +; CHECK-NEXT: [[TMP12:%.*]] = or <4 x i8> [[TMP11]], <i8 1, i8 1, i8 1, i8 1> |
| 37 | +; CHECK-NEXT: [[TMP13:%.*]] = zext <4 x i8> [[TMP12]] to <4 x i32> |
| 38 | +; CHECK-NEXT: store <4 x i32> [[TMP13]], ptr [[TMP9]], align 16 |
| 39 | +; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds [16 x i32], ptr [[I1]], i64 0, i64 12 |
| 40 | +; CHECK-NEXT: [[TMP15:%.*]] = getelementptr [64 x i8], ptr [[ARG]], i64 0, i64 13 |
| 41 | +; CHECK-NEXT: [[WIDE_LOAD_3:%.*]] = load <4 x i8>, ptr [[TMP15]], align 1 |
| 42 | +; CHECK-NEXT: [[TMP16:%.*]] = shufflevector <4 x i8> [[WIDE_LOAD_2]], <4 x i8> [[WIDE_LOAD_3]], <4 x i32> <i32 3, i32 4, i32 5, i32 6> |
| 43 | +; CHECK-NEXT: [[TMP17:%.*]] = or <4 x i8> [[TMP16]], <i8 1, i8 1, i8 1, i8 1> |
| 44 | +; CHECK-NEXT: [[TMP18:%.*]] = zext <4 x i8> [[TMP17]] to <4 x i32> |
| 45 | +; CHECK-NEXT: store <4 x i32> [[TMP18]], ptr [[TMP14]], align 16 |
| 46 | +; CHECK-NEXT: [[I3_I_I:%.*]] = load i32, ptr [[I1]], align 16 |
| 47 | +; CHECK-NEXT: [[I4_I_I:%.*]] = add i32 [[I3_I_I]], 1 |
| 48 | +; CHECK-NEXT: store i32 [[I4_I_I]], ptr [[ARG]], align 4 |
| 49 | +; CHECK-NEXT: ret void |
| 50 | +; |
| 51 | +bb: |
| 52 | + %i = alloca [0 x [0 x [0 x [0 x [0 x [0 x %t0]]]]]], i32 0, align 8 |
| 53 | + %i1 = alloca %t1, align 4 |
| 54 | + store ptr %arg, ptr %i, align 8 |
| 55 | + %i2 = getelementptr %t0, ptr %i, i64 0, i32 1 |
| 56 | + store ptr %i1, ptr %i2, align 8 |
| 57 | + br label %bb3 |
| 58 | + |
| 59 | +bb3: ; preds = %bb7, %bb |
| 60 | + %i4 = phi i32 [ 0, %bb ], [ %i8, %bb7 ] |
| 61 | + %i5 = icmp ult i32 %i4, 16 |
| 62 | + br i1 %i5, label %bb7, label %bb6 |
| 63 | + |
| 64 | +bb6: ; preds = %bb3 |
| 65 | + call void @baz(ptr %i, ptr %arg) |
| 66 | + ret void |
| 67 | + |
| 68 | +bb7: ; preds = %bb3 |
| 69 | + call void @foo(ptr %i, i32 %i4) |
| 70 | + %i8 = add i32 %i4, 1 |
| 71 | + br label %bb3 |
| 72 | +} |
| 73 | + |
| 74 | +define linkonce_odr ptr @hoge(ptr %arg, i64 %arg1) { |
| 75 | +bb: |
| 76 | + %i = call ptr @ham(ptr %arg, i64 %arg1) |
| 77 | + ret ptr %i |
| 78 | +} |
| 79 | + |
| 80 | +define linkonce_odr void @foo(ptr %arg, i32 %arg1) { |
| 81 | +bb: |
| 82 | + %i = load ptr, ptr %arg, align 8 |
| 83 | + br label %bb2 |
| 84 | + |
| 85 | +bb2: ; preds = %bb6, %bb |
| 86 | + %i3 = phi i32 [ 3, %bb ], [ %i17, %bb6 ] |
| 87 | + %i4 = icmp sgt i32 %i3, -1 |
| 88 | + br i1 %i4, label %bb6, label %bb5 |
| 89 | + |
| 90 | +bb5: ; preds = %bb2 |
| 91 | + ret void |
| 92 | + |
| 93 | +bb6: ; preds = %bb2 |
| 94 | + %i7 = add i32 %i3, %arg1 |
| 95 | + %i8 = sext i32 %i7 to i64 |
| 96 | + %i9 = call ptr @hoge(ptr %i, i64 %i8) |
| 97 | + %i10 = load i8, ptr %i9, align 1 |
| 98 | + %i11 = getelementptr %t0, ptr %arg, i64 0, i32 1 |
| 99 | + %i12 = load ptr, ptr %i11, align 8 |
| 100 | + %i13 = sext i32 %arg1 to i64 |
| 101 | + %i14 = call ptr @foo.1(ptr %i12, i64 %i13) |
| 102 | + %i15 = or i8 %i10, 1 |
| 103 | + %i16 = zext i8 %i15 to i32 |
| 104 | + store i32 %i16, ptr %i14, align 4 |
| 105 | + %i17 = add i32 %i3, -1 |
| 106 | + br label %bb2 |
| 107 | +} |
| 108 | + |
| 109 | +define linkonce_odr void @baz(ptr %arg, ptr %arg1) { |
| 110 | +bb: |
| 111 | + call void @pluto(ptr %arg, ptr %arg1) |
| 112 | + ret void |
| 113 | +} |
| 114 | + |
| 115 | +define linkonce_odr ptr @foo.1(ptr %arg, i64 %arg1) { |
| 116 | +bb: |
| 117 | + %i = call ptr @baz.2(ptr %arg, i64 %arg1) |
| 118 | + ret ptr %i |
| 119 | +} |
| 120 | + |
| 121 | +define linkonce_odr ptr @baz.2(ptr %arg, i64 %arg1) { |
| 122 | +bb: |
| 123 | + %i = getelementptr [16 x i32], ptr %arg, i64 0, i64 %arg1 |
| 124 | + ret ptr %i |
| 125 | +} |
| 126 | + |
| 127 | +define linkonce_odr void @pluto(ptr %arg, ptr %arg1) { |
| 128 | +bb: |
| 129 | + %i = getelementptr %t2, ptr %arg, i64 0, i32 1 |
| 130 | + %i2 = load ptr, ptr %i, align 8 |
| 131 | + %i3 = load i32, ptr %i2, align 4 |
| 132 | + %i4 = add i32 %i3, 1 |
| 133 | + store i32 %i4, ptr %arg1, align 4 |
| 134 | + ret void |
| 135 | +} |
| 136 | + |
| 137 | +define linkonce_odr ptr @ham(ptr %arg, i64 %arg1) { |
| 138 | +bb: |
| 139 | + %i = getelementptr [64 x i8], ptr %arg, i64 0, i64 %arg1 |
| 140 | + ret ptr %i |
| 141 | +} |
0 commit comments