Changeset View
Changeset View
Standalone View
Standalone View
clang/test/OpenMP/nvptx_teams_reduction_codegen.cpp
Show All 18 Lines | |||||
// SEQ-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* undef | // SEQ-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* undef | ||||
// SEQ-DAG: [[KERNEL_SHARED1:@.+]] = internal unnamed_addr constant i16 1 | // SEQ-DAG: [[KERNEL_SHARED1:@.+]] = internal unnamed_addr constant i16 1 | ||||
// SEQ-DAG: [[KERNEL_SHARED2:@.+]] = internal unnamed_addr constant i16 1 | // SEQ-DAG: [[KERNEL_SHARED2:@.+]] = internal unnamed_addr constant i16 1 | ||||
// SEQ-DAG: [[KERNEL_SIZE1:@.+]] = internal unnamed_addr constant i{{64|32}} {{16|8}} | // SEQ-DAG: [[KERNEL_SIZE1:@.+]] = internal unnamed_addr constant i{{64|32}} {{16|8}} | ||||
// SEQ-DAG: [[KERNEL_SIZE2:@.+]] = internal unnamed_addr constant i{{64|32}} 16 | // SEQ-DAG: [[KERNEL_SIZE2:@.+]] = internal unnamed_addr constant i{{64|32}} 16 | ||||
// Check for the data transfer medium in shared memory to transfer the reduction list to the first warp. | // Check for the data transfer medium in shared memory to transfer the reduction list to the first warp. | ||||
// CHECK-DAG: [[TRANSFER_STORAGE:@.+]] = internal addrspace([[SHARED_ADDRSPACE:[0-9]+]]) global [32 x i32] | // CHECK-DAG: [[TRANSFER_STORAGE:@.+]] = weak addrspace([[SHARED_ADDRSPACE:[0-9]+]]) global [32 x i32] | ||||
// Check that the execution mode of 2 target regions is set to Non-SPMD and the 3rd is in SPMD. | // Check that the execution mode of 2 target regions is set to Non-SPMD and the 3rd is in SPMD. | ||||
// CHECK-DAG: {{@__omp_offloading_.+l44}}_exec_mode = weak constant i8 1 | // CHECK-DAG: {{@__omp_offloading_.+l44}}_exec_mode = weak constant i8 1 | ||||
// CHECK-DAG: {{@__omp_offloading_.+l50}}_exec_mode = weak constant i8 1 | // CHECK-DAG: {{@__omp_offloading_.+l50}}_exec_mode = weak constant i8 1 | ||||
// CHECK-DAG: {{@__omp_offloading_.+l57}}_exec_mode = weak constant i8 0 | // CHECK-DAG: {{@__omp_offloading_.+l57}}_exec_mode = weak constant i8 0 | ||||
// CHECK-DAG: [[TEAMS_RED_BUFFER:@.+]] = internal global [[TEAMS_REDUCE_UNION_TY]] zeroinitializer | // CHECK-DAG: [[TEAMS_RED_BUFFER:@.+]] = internal global [[TEAMS_REDUCE_UNION_TY]] zeroinitializer | ||||
▲ Show 20 Lines • Show All 179 Lines • ▼ Show 20 Lines | int bar(int n){ | ||||
// CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | // CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | ||||
// | // | ||||
// [[DO_COPY]] | // [[DO_COPY]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 0 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 0 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[BASE_ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | // CHECK: [[BASE_ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | ||||
// CHECK: [[ELT:%.+]] = getelementptr i32, i32* [[BASE_ELT]], i32 [[CNT]] | // CHECK: [[ELT:%.+]] = getelementptr i32, i32* [[BASE_ELT]], i32 [[CNT]] | ||||
// | // | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[WARPID]] | // CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[WARPID]] | ||||
// CHECK: [[ELT_VAL:%.+]] = load i32, i32* [[ELT]], | // CHECK: [[ELT_VAL:%.+]] = load i32, i32* [[ELT]], | ||||
// CHECK: store volatile i32 [[ELT_VAL]], i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], | // CHECK: store volatile i32 [[ELT_VAL]], i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], | ||||
// CHECK: br label {{%?}}[[COPY_CONT:.+]] | // CHECK: br label {{%?}}[[COPY_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[COPY_ELSE]] | // CHECK: [[COPY_ELSE]] | ||||
// CHECK: br label {{%?}}[[COPY_CONT]] | // CHECK: br label {{%?}}[[COPY_CONT]] | ||||
// | // | ||||
// Barrier after copy to shared memory storage medium. | // Barrier after copy to shared memory storage medium. | ||||
// CHECK: [[COPY_CONT]] | // CHECK: [[COPY_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | // CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | ||||
// | // | ||||
// Read into warp 0. | // Read into warp 0. | ||||
// CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | // CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | ||||
// CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | // CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | ||||
// | // | ||||
// CHECK: [[DO_READ]] | // CHECK: [[DO_READ]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[TID]] | // CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[TID]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 0 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 0 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT_BASE:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | // CHECK: [[ELT_BASE:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | ||||
// CHECK: [[ELT:%.+]] = getelementptr i32, i32* [[ELT_BASE]], i32 [[CNT]] | // CHECK: [[ELT:%.+]] = getelementptr i32, i32* [[ELT_BASE]], i32 [[CNT]] | ||||
// CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i32, i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], | // CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i32, i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], | ||||
// CHECK: store i32 [[MEDIUM_ELT_VAL]], i32* [[ELT]], | // CHECK: store i32 [[MEDIUM_ELT_VAL]], i32* [[ELT]], | ||||
// CHECK: br label {{%?}}[[READ_CONT:.+]] | // CHECK: br label {{%?}}[[READ_CONT:.+]] | ||||
// | // | ||||
▲ Show 20 Lines • Show All 276 Lines • ▼ Show 20 Lines | int bar(int n){ | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | // CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | ||||
// CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | // CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | ||||
// | // | ||||
// [[DO_COPY]] | // [[DO_COPY]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 0 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 0 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// | // | ||||
// CHECK: [[MEDIUM_ELT64:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[WARPID]] | // CHECK: [[MEDIUM_ELT64:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[WARPID]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT64]] to i8 addrspace([[SHARED_ADDRSPACE]])* | // CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT64]] to i8 addrspace([[SHARED_ADDRSPACE]])* | ||||
// CHECK: [[ELT_VAL:%.+]] = load i8, i8* [[ELT_VOID]], align | // CHECK: [[ELT_VAL:%.+]] = load i8, i8* [[ELT_VOID]], align | ||||
// CHECK: store volatile i8 [[ELT_VAL]], i8 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: store volatile i8 [[ELT_VAL]], i8 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: br label {{%?}}[[COPY_CONT:.+]] | // CHECK: br label {{%?}}[[COPY_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[COPY_ELSE]] | // CHECK: [[COPY_ELSE]] | ||||
// CHECK: br label {{%?}}[[COPY_CONT]] | // CHECK: br label {{%?}}[[COPY_CONT]] | ||||
// | // | ||||
// Barrier after copy to shared memory storage medium. | // Barrier after copy to shared memory storage medium. | ||||
// CHECK: [[COPY_CONT]] | // CHECK: [[COPY_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | // CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | ||||
// | // | ||||
// Read into warp 0. | // Read into warp 0. | ||||
// CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | // CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | ||||
// CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | // CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | ||||
// | // | ||||
// CHECK: [[DO_READ]] | // CHECK: [[DO_READ]] | ||||
// CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[TID]] | // CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[TID]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i8 addrspace([[SHARED_ADDRSPACE]])* | // CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i8 addrspace([[SHARED_ADDRSPACE]])* | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 0 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 0 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i8, i8 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i8, i8 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: store i8 [[MEDIUM_ELT_VAL]], i8* [[ELT_VOID]], align | // CHECK: store i8 [[MEDIUM_ELT_VAL]], i8* [[ELT_VOID]], align | ||||
// CHECK: br label {{%?}}[[READ_CONT:.+]] | // CHECK: br label {{%?}}[[READ_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[READ_ELSE]] | // CHECK: [[READ_ELSE]] | ||||
// CHECK: br label {{%?}}[[READ_CONT]] | // CHECK: br label {{%?}}[[READ_CONT]] | ||||
// | // | ||||
// CHECK: [[READ_CONT]] | // CHECK: [[READ_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | // CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | ||||
// CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | // CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | ||||
// | // | ||||
// [[DO_COPY]] | // [[DO_COPY]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 1 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 1 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | ||||
// | // | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[WARPID]] | // CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[WARPID]] | ||||
// CHECK: [[ELT_VAL:%.+]] = load i32, i32* [[ELT]], align | // CHECK: [[ELT_VAL:%.+]] = load i32, i32* [[ELT]], align | ||||
// CHECK: store volatile i32 [[ELT_VAL]], i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: store volatile i32 [[ELT_VAL]], i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: br label {{%?}}[[COPY_CONT:.+]] | // CHECK: br label {{%?}}[[COPY_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[COPY_ELSE]] | // CHECK: [[COPY_ELSE]] | ||||
// CHECK: br label {{%?}}[[COPY_CONT]] | // CHECK: br label {{%?}}[[COPY_CONT]] | ||||
// | // | ||||
// Barrier after copy to shared memory storage medium. | // Barrier after copy to shared memory storage medium. | ||||
// CHECK: [[COPY_CONT]] | // CHECK: [[COPY_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | // CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | ||||
// | // | ||||
// Read into warp 0. | // Read into warp 0. | ||||
// CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | // CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | ||||
// CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | // CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | ||||
// | // | ||||
// CHECK: [[DO_READ]] | // CHECK: [[DO_READ]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[TID]] | // CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[TID]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 1 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 1 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | ||||
// CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i32, i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i32, i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: store i32 [[MEDIUM_ELT_VAL]], i32* [[ELT]], align | // CHECK: store i32 [[MEDIUM_ELT_VAL]], i32* [[ELT]], align | ||||
// CHECK: br label {{%?}}[[READ_CONT:.+]] | // CHECK: br label {{%?}}[[READ_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[READ_ELSE]] | // CHECK: [[READ_ELSE]] | ||||
▲ Show 20 Lines • Show All 376 Lines • ▼ Show 20 Lines | int bar(int n){ | ||||
// CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | // CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | ||||
// CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | // CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | ||||
// | // | ||||
// [[DO_COPY]] | // [[DO_COPY]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST]], i[[SZ]] 0, i[[SZ]] 0 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST]], i[[SZ]] 0, i[[SZ]] 0 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | ||||
// | // | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[WARPID]] | // CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[WARPID]] | ||||
// CHECK: [[ELT_VAL:%.+]] = load i32, i32* [[ELT]], align | // CHECK: [[ELT_VAL:%.+]] = load i32, i32* [[ELT]], align | ||||
// CHECK: store volatile i32 [[ELT_VAL]], i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: store volatile i32 [[ELT_VAL]], i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: br label {{%?}}[[COPY_CONT:.+]] | // CHECK: br label {{%?}}[[COPY_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[COPY_ELSE]] | // CHECK: [[COPY_ELSE]] | ||||
// CHECK: br label {{%?}}[[COPY_CONT]] | // CHECK: br label {{%?}}[[COPY_CONT]] | ||||
// | // | ||||
// Barrier after copy to shared memory storage medium. | // Barrier after copy to shared memory storage medium. | ||||
// CHECK: [[COPY_CONT]] | // CHECK: [[COPY_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | // CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | ||||
// | // | ||||
// Read into warp 0. | // Read into warp 0. | ||||
// CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | // CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | ||||
// CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | // CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | ||||
// | // | ||||
// CHECK: [[DO_READ]] | // CHECK: [[DO_READ]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[TID]] | // CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[TID]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST:%.+]], i[[SZ]] 0, i[[SZ]] 0 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST:%.+]], i[[SZ]] 0, i[[SZ]] 0 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | ||||
// CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i32, i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i32, i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: store i32 [[MEDIUM_ELT_VAL]], i32* [[ELT]], align | // CHECK: store i32 [[MEDIUM_ELT_VAL]], i32* [[ELT]], align | ||||
// CHECK: br label {{%?}}[[READ_CONT:.+]] | // CHECK: br label {{%?}}[[READ_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[READ_ELSE]] | // CHECK: [[READ_ELSE]] | ||||
// CHECK: br label {{%?}}[[READ_CONT]] | // CHECK: br label {{%?}}[[READ_CONT]] | ||||
// | // | ||||
// CHECK: [[READ_CONT]] | // CHECK: [[READ_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | // CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | ||||
// CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | // CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | ||||
// | // | ||||
// [[DO_COPY]] | // [[DO_COPY]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST]], i[[SZ]] 0, i[[SZ]] 1 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST]], i[[SZ]] 0, i[[SZ]] 1 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i16* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i16* | ||||
// | // | ||||
// CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[WARPID]] | // CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[WARPID]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i16 addrspace([[SHARED_ADDRSPACE]])* | // CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i16 addrspace([[SHARED_ADDRSPACE]])* | ||||
// CHECK: [[ELT_VAL:%.+]] = load i16, i16* [[ELT]], align | // CHECK: [[ELT_VAL:%.+]] = load i16, i16* [[ELT]], align | ||||
// CHECK: store volatile i16 [[ELT_VAL]], i16 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: store volatile i16 [[ELT_VAL]], i16 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: br label {{%?}}[[COPY_CONT:.+]] | // CHECK: br label {{%?}}[[COPY_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[COPY_ELSE]] | // CHECK: [[COPY_ELSE]] | ||||
// CHECK: br label {{%?}}[[COPY_CONT]] | // CHECK: br label {{%?}}[[COPY_CONT]] | ||||
// | // | ||||
// Barrier after copy to shared memory storage medium. | // Barrier after copy to shared memory storage medium. | ||||
// CHECK: [[COPY_CONT]] | // CHECK: [[COPY_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | // CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | ||||
// | // | ||||
// Read into warp 0. | // Read into warp 0. | ||||
// CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | // CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | ||||
// CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | // CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | ||||
// | // | ||||
// CHECK: [[DO_READ]] | // CHECK: [[DO_READ]] | ||||
// CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[TID]] | // CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[TID]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i16 addrspace([[SHARED_ADDRSPACE]])* | // CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i16 addrspace([[SHARED_ADDRSPACE]])* | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST:%.+]], i[[SZ]] 0, i[[SZ]] 1 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST:%.+]], i[[SZ]] 0, i[[SZ]] 1 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i16* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i16* | ||||
// CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i16, i16 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i16, i16 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: store i16 [[MEDIUM_ELT_VAL]], i16* [[ELT]], align | // CHECK: store i16 [[MEDIUM_ELT_VAL]], i16* [[ELT]], align | ||||
// CHECK: br label {{%?}}[[READ_CONT:.+]] | // CHECK: br label {{%?}}[[READ_CONT:.+]] | ||||
// | // | ||||
▲ Show 20 Lines • Show All 159 Lines • ▼ Show 20 Lines | |||||
// CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | // CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | ||||
// CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | // CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | ||||
// | // | ||||
// [[DO_COPY]] | // [[DO_COPY]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 0 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 0 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | ||||
// | // | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[WARPID]] | // CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[WARPID]] | ||||
// CHECK: [[ELT_VAL:%.+]] = load i32, i32* [[ELT]], align | // CHECK: [[ELT_VAL:%.+]] = load i32, i32* [[ELT]], align | ||||
// CHECK: store volatile i32 [[ELT_VAL]], i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: store volatile i32 [[ELT_VAL]], i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: br label {{%?}}[[COPY_CONT:.+]] | // CHECK: br label {{%?}}[[COPY_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[COPY_ELSE]] | // CHECK: [[COPY_ELSE]] | ||||
// CHECK: br label {{%?}}[[COPY_CONT]] | // CHECK: br label {{%?}}[[COPY_CONT]] | ||||
// | // | ||||
// Barrier after copy to shared memory storage medium. | // Barrier after copy to shared memory storage medium. | ||||
// CHECK: [[COPY_CONT]] | // CHECK: [[COPY_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | // CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | ||||
// | // | ||||
// Read into warp 0. | // Read into warp 0. | ||||
// CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | // CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | ||||
// CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | // CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | ||||
// | // | ||||
// CHECK: [[DO_READ]] | // CHECK: [[DO_READ]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[TID]] | // CHECK: [[MEDIUM_ELT:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[TID]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 0 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 0 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i32* | ||||
// CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i32, i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i32, i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: store i32 [[MEDIUM_ELT_VAL]], i32* [[ELT]], align | // CHECK: store i32 [[MEDIUM_ELT_VAL]], i32* [[ELT]], align | ||||
// CHECK: br label {{%?}}[[READ_CONT:.+]] | // CHECK: br label {{%?}}[[READ_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[READ_ELSE]] | // CHECK: [[READ_ELSE]] | ||||
// CHECK: br label {{%?}}[[READ_CONT]] | // CHECK: br label {{%?}}[[READ_CONT]] | ||||
// | // | ||||
// CHECK: [[READ_CONT]] | // CHECK: [[READ_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | // CHECK: [[IS_WARP_MASTER:%.+]] = icmp eq i32 [[LANEID]], 0 | ||||
// CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | // CHECK: br i1 [[IS_WARP_MASTER]], label {{%?}}[[DO_COPY:.+]], label {{%?}}[[COPY_ELSE:.+]] | ||||
// | // | ||||
// [[DO_COPY]] | // [[DO_COPY]] | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 1 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST]], i{{32|64}} 0, i{{32|64}} 1 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i16* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i16* | ||||
// | // | ||||
// CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[WARPID]] | // CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[WARPID]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i16 addrspace([[SHARED_ADDRSPACE]])* | // CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i16 addrspace([[SHARED_ADDRSPACE]])* | ||||
// CHECK: [[ELT_VAL:%.+]] = load i16, i16* [[ELT]], align | // CHECK: [[ELT_VAL:%.+]] = load i16, i16* [[ELT]], align | ||||
// CHECK: store volatile i16 [[ELT_VAL]], i16 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: store volatile i16 [[ELT_VAL]], i16 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: br label {{%?}}[[COPY_CONT:.+]] | // CHECK: br label {{%?}}[[COPY_CONT:.+]] | ||||
// | // | ||||
// CHECK: [[COPY_ELSE]] | // CHECK: [[COPY_ELSE]] | ||||
// CHECK: br label {{%?}}[[COPY_CONT]] | // CHECK: br label {{%?}}[[COPY_CONT]] | ||||
// | // | ||||
// Barrier after copy to shared memory storage medium. | // Barrier after copy to shared memory storage medium. | ||||
// CHECK: [[COPY_CONT]] | // CHECK: [[COPY_CONT]] | ||||
// CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | // CHECK: call void @__kmpc_barrier(%struct.ident_t* @ | ||||
// CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | // CHECK: [[ACTIVE_WARPS:%.+]] = load i32, i32* | ||||
// | // | ||||
// Read into warp 0. | // Read into warp 0. | ||||
// CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | // CHECK: [[IS_W0_ACTIVE_THREAD:%.+]] = icmp ult i32 [[TID:%.+]], [[ACTIVE_WARPS]] | ||||
// CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | // CHECK: br i1 [[IS_W0_ACTIVE_THREAD]], label {{%?}}[[DO_READ:.+]], label {{%?}}[[READ_ELSE:.+]] | ||||
// | // | ||||
// CHECK: [[DO_READ]] | // CHECK: [[DO_READ]] | ||||
// CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE:@.+]], i64 0, i32 [[TID]] | // CHECK: [[MEDIUM_ELT32:%.+]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace([[SHARED_ADDRSPACE]])* [[TRANSFER_STORAGE]], i64 0, i32 [[TID]] | ||||
// CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i16 addrspace([[SHARED_ADDRSPACE]])* | // CHECK: [[MEDIUM_ELT:%.+]] = bitcast i32 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT32]] to i16 addrspace([[SHARED_ADDRSPACE]])* | ||||
// CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 1 | // CHECK: [[ELT_REF:%.+]] = getelementptr inbounds [[RLT]], [[RLT]]* [[RED_LIST:%.+]], i{{32|64}} 0, i{{32|64}} 1 | ||||
// CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | // CHECK: [[ELT_VOID:%.+]] = load i8*, i8** [[ELT_REF]], | ||||
// CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i16* | // CHECK: [[ELT:%.+]] = bitcast i8* [[ELT_VOID]] to i16* | ||||
// CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i16, i16 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | // CHECK: [[MEDIUM_ELT_VAL:%.+]] = load volatile i16, i16 addrspace([[SHARED_ADDRSPACE]])* [[MEDIUM_ELT]], align | ||||
// CHECK: store i16 [[MEDIUM_ELT_VAL]], i16* [[ELT]], align | // CHECK: store i16 [[MEDIUM_ELT_VAL]], i16* [[ELT]], align | ||||
// CHECK: br label {{%?}}[[READ_CONT:.+]] | // CHECK: br label {{%?}}[[READ_CONT:.+]] | ||||
// | // | ||||
▲ Show 20 Lines • Show All 115 Lines • Show Last 20 Lines |