@@ -276,21 +276,19 @@ if.false: ; preds = %if.true, %entry
276
276
}
277
277
278
278
;; Both of successor 0 and successor 1 have a single predecessor.
279
- ;; TODO: Support transform for this case.
280
279
define void @single_predecessor (ptr %p , ptr %q , i32 %a ) {
281
280
; CHECK-LABEL: @single_predecessor(
282
281
; CHECK-NEXT: entry:
283
282
; 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]])
286
291
; 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]]
294
292
;
295
293
entry:
296
294
%tobool = icmp ne i32 %a , 0
@@ -728,6 +726,34 @@ if.true:
728
726
ret i32 %res
729
727
}
730
728
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
+
731
757
declare i32 @read_memory_only () readonly nounwind willreturn speculatable
732
758
733
759
!llvm.dbg.cu = !{!0 }
0 commit comments