@@ -276,21 +276,19 @@ if.false: ; preds = %if.true, %entry
276276}
277277
278278;; Both of successor 0 and successor 1 have a single predecessor.
279- ;; TODO: Support transform for this case.
280279define void @single_predecessor (ptr %p , ptr %q , i32 %a ) {
281280; CHECK-LABEL: @single_predecessor(
282281; CHECK-NEXT: entry:
283282; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[A:%.*]], 0
284- ; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
285- ; CHECK: common.ret:
283+ ; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[TOBOOL]], true
284+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i1 [[TMP0]] to <1 x i1>
285+ ; CHECK-NEXT: [[TMP2:%.*]] = bitcast i1 [[TOBOOL]] to <1 x i1>
286+ ; CHECK-NEXT: call void @llvm.masked.store.v1i32.p0(<1 x i32> <i32 1>, ptr [[Q:%.*]], i32 4, <1 x i1> [[TMP2]])
287+ ; CHECK-NEXT: [[TMP3:%.*]] = call <1 x i32> @llvm.masked.load.v1i32.p0(ptr [[Q]], i32 4, <1 x i1> [[TMP1]], <1 x i32> poison)
288+ ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <1 x i32> [[TMP3]] to i32
289+ ; CHECK-NEXT: [[TMP5:%.*]] = bitcast i32 [[TMP4]] to <1 x i32>
290+ ; CHECK-NEXT: call void @llvm.masked.store.v1i32.p0(<1 x i32> [[TMP5]], ptr [[P:%.*]], i32 4, <1 x i1> [[TMP1]])
286291; CHECK-NEXT: ret void
287- ; CHECK: if.end:
288- ; CHECK-NEXT: store i32 1, ptr [[Q:%.*]], align 4
289- ; CHECK-NEXT: br label [[COMMON_RET:%.*]]
290- ; CHECK: if.then:
291- ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[Q]], align 4
292- ; CHECK-NEXT: store i32 [[TMP0]], ptr [[P:%.*]], align 4
293- ; CHECK-NEXT: br label [[COMMON_RET]]
294292;
295293entry:
296294 %tobool = icmp ne i32 %a , 0
@@ -728,6 +726,34 @@ if.true:
728726 ret i32 %res
729727}
730728
729+ define void @diamondCFG (i32 %a , ptr %c , ptr %d ) {
730+ ; CHECK-LABEL: @diamondCFG(
731+ ; CHECK-NEXT: entry:
732+ ; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[A:%.*]], 0
733+ ; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[TOBOOL_NOT]], true
734+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i1 [[TMP0]] to <1 x i1>
735+ ; CHECK-NEXT: [[TMP2:%.*]] = bitcast i1 [[TOBOOL_NOT]] to <1 x i1>
736+ ; CHECK-NEXT: call void @llvm.masked.store.v1i32.p0(<1 x i32> zeroinitializer, ptr [[D:%.*]], i32 4, <1 x i1> [[TMP2]])
737+ ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[A]] to <1 x i32>
738+ ; CHECK-NEXT: call void @llvm.masked.store.v1i32.p0(<1 x i32> [[TMP3]], ptr [[C:%.*]], i32 4, <1 x i1> [[TMP1]])
739+ ; CHECK-NEXT: ret void
740+ ;
741+ entry:
742+ %tobool.not = icmp eq i32 %a , 0
743+ br i1 %tobool.not , label %if.else , label %if.then
744+
745+ if.then: ; preds = %entry
746+ store i32 %a , ptr %c , align 4
747+ br label %if.end
748+
749+ if.else: ; preds = %entry
750+ store i32 0 , ptr %d , align 4
751+ br label %if.end
752+
753+ if.end: ; preds = %if.else, %if.then
754+ ret void
755+ }
756+
731757declare i32 @read_memory_only () readonly nounwind willreturn speculatable
732758
733759!llvm.dbg.cu = !{!0 }
0 commit comments