|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=instcombine -S < %s | FileCheck %s |
| 3 | + |
| 4 | +%struct.type = type { [256 x <2 x i64>] } |
| 5 | +@g1 = external hidden addrspace(3) global %struct.type, align 16 |
| 6 | + |
| 7 | +define <2 x i64> @func(ptr addrspace(4) byref(%struct.type) align 16 %0, i1 %cmp.0) { |
| 8 | +; CHECK-LABEL: define <2 x i64> @func( |
| 9 | +; CHECK-SAME: ptr addrspace(4) byref([[STRUCT_TYPE:%.*]]) align 16 [[TMP0:%.*]], i1 [[CMP_0:%.*]]) { |
| 10 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 11 | +; CHECK-NEXT: [[COERCE:%.*]] = alloca [[STRUCT_TYPE]], align 16, addrspace(5) |
| 12 | +; CHECK-NEXT: call void @llvm.memcpy.p5.p4.i64(ptr addrspace(5) noundef align 16 dereferenceable(4096) [[COERCE]], ptr addrspace(4) noundef align 16 dereferenceable(4096) [[TMP0]], i64 4096, i1 false) |
| 13 | +; CHECK-NEXT: br i1 [[CMP_0]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] |
| 14 | +; CHECK: [[IF_THEN]]: |
| 15 | +; CHECK-NEXT: [[VAL_THEN:%.*]] = addrspacecast ptr addrspace(5) [[COERCE]] to ptr |
| 16 | +; CHECK-NEXT: br label %[[SINK:.*]] |
| 17 | +; CHECK: [[IF_ELSE]]: |
| 18 | +; CHECK-NEXT: [[PTR_ELSE:%.*]] = load ptr, ptr addrspace(3) getelementptr inbounds nuw (i8, ptr addrspace(3) @g1, i32 32), align 16 |
| 19 | +; CHECK-NEXT: br label %[[SINK]] |
| 20 | +; CHECK: [[SINK]]: |
| 21 | +; CHECK-NEXT: [[PTR_SINK:%.*]] = phi ptr [ [[PTR_ELSE]], %[[IF_ELSE]] ], [ [[VAL_THEN]], %[[IF_THEN]] ] |
| 22 | +; CHECK-NEXT: [[VAL_SINK:%.*]] = load <2 x i64>, ptr [[PTR_SINK]], align 16 |
| 23 | +; CHECK-NEXT: ret <2 x i64> [[VAL_SINK]] |
| 24 | +; |
| 25 | +entry: |
| 26 | + %coerce = alloca %struct.type, align 16, addrspace(5) |
| 27 | + call void @llvm.memcpy.p5.p4.i64(ptr addrspace(5) align 16 %coerce, ptr addrspace(4) align 16 %0, i64 4096, i1 false) |
| 28 | + br i1 %cmp.0, label %if.then, label %if.else |
| 29 | + |
| 30 | +if.then: ; preds = %entry |
| 31 | + %ptr.then = getelementptr inbounds i8, ptr addrspace(5) %coerce, i64 0 |
| 32 | + %val.then = addrspacecast ptr addrspace(5) %ptr.then to ptr |
| 33 | + br label %sink |
| 34 | + |
| 35 | +if.else: ; preds = %entry |
| 36 | + %ptr.else = load ptr, ptr addrspace(3) getelementptr inbounds nuw (i8, ptr addrspace(3) @g1, i32 32), align 16 |
| 37 | + %val.else = getelementptr inbounds nuw i8, ptr %ptr.else, i64 0 |
| 38 | + br label %sink |
| 39 | + |
| 40 | +sink: |
| 41 | + %ptr.sink = phi ptr [ %val.else, %if.else ], [ %val.then, %if.then ] |
| 42 | + %val.sink = load <2 x i64>, ptr %ptr.sink, align 16 |
| 43 | + ret <2 x i64> %val.sink |
| 44 | +} |
| 45 | + |
| 46 | +; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite) |
| 47 | +declare void @llvm.memcpy.p5.p4.i64(ptr addrspace(5) noalias writeonly captures(none), ptr addrspace(4) noalias readonly captures(none), i64, i1 immarg) #0 |
0 commit comments