@@ -573,3 +573,69 @@ exit:
573
573
%res = select i1 %cond2 , i8 %res.phi , i8 %res.load
574
574
ret i8 %res
575
575
}
576
+
577
+ ; `swifterror` addresses are restricted to load and stores and call arguments.
578
+ declare void @takeAddress (i8** swifterror )
579
+
580
+ define i8* @test_dont_optimize_swifterror (i1 %cond , i1 %cond2 , i8* %ptr ) {
581
+ ; INSTCOMBINE-LABEL: @test_dont_optimize_swifterror(
582
+ ; INSTCOMBINE-NEXT: entry:
583
+ ; INSTCOMBINE-NEXT: [[OBJ:%.*]] = alloca swifterror i8*, align 8
584
+ ; INSTCOMBINE-NEXT: [[OBJ2:%.*]] = alloca swifterror i8*, align 8
585
+ ; INSTCOMBINE-NEXT: call void @takeAddress(i8** nonnull swifterror [[OBJ]])
586
+ ; INSTCOMBINE-NEXT: call void @takeAddress(i8** nonnull swifterror [[OBJ2]])
587
+ ; INSTCOMBINE-NEXT: store i8* [[PTR:%.*]], i8** [[OBJ]], align 8
588
+ ; INSTCOMBINE-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
589
+ ; INSTCOMBINE: bb1:
590
+ ; INSTCOMBINE-NEXT: [[RES1:%.*]] = load i8*, i8** [[OBJ]], align 8
591
+ ; INSTCOMBINE-NEXT: br label [[EXIT:%.*]]
592
+ ; INSTCOMBINE: bb2:
593
+ ; INSTCOMBINE-NEXT: [[RES2:%.*]] = load i8*, i8** [[OBJ2]], align 8
594
+ ; INSTCOMBINE-NEXT: br label [[EXIT]]
595
+ ; INSTCOMBINE: exit:
596
+ ; INSTCOMBINE-NEXT: [[RES_PHI:%.*]] = phi i8* [ [[RES1]], [[BB1]] ], [ [[RES2]], [[BB2]] ]
597
+ ; INSTCOMBINE-NEXT: store i8* null, i8** [[OBJ]], align 8
598
+ ; INSTCOMBINE-NEXT: [[RES:%.*]] = select i1 [[COND2:%.*]], i8* [[RES_PHI]], i8* null
599
+ ; INSTCOMBINE-NEXT: ret i8* [[RES]]
600
+ ;
601
+ ; INSTCOMBINEGVN-LABEL: @test_dont_optimize_swifterror(
602
+ ; INSTCOMBINEGVN-NEXT: entry:
603
+ ; INSTCOMBINEGVN-NEXT: [[OBJ:%.*]] = alloca swifterror i8*, align 8
604
+ ; INSTCOMBINEGVN-NEXT: [[OBJ2:%.*]] = alloca swifterror i8*, align 8
605
+ ; INSTCOMBINEGVN-NEXT: call void @takeAddress(i8** nonnull swifterror [[OBJ]])
606
+ ; INSTCOMBINEGVN-NEXT: call void @takeAddress(i8** nonnull swifterror [[OBJ2]])
607
+ ; INSTCOMBINEGVN-NEXT: store i8* [[PTR:%.*]], i8** [[OBJ]], align 8
608
+ ; INSTCOMBINEGVN-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
609
+ ; INSTCOMBINEGVN: bb1:
610
+ ; INSTCOMBINEGVN-NEXT: br label [[EXIT:%.*]]
611
+ ; INSTCOMBINEGVN: bb2:
612
+ ; INSTCOMBINEGVN-NEXT: [[RES2:%.*]] = load i8*, i8** [[OBJ2]], align 8
613
+ ; INSTCOMBINEGVN-NEXT: br label [[EXIT]]
614
+ ; INSTCOMBINEGVN: exit:
615
+ ; INSTCOMBINEGVN-NEXT: [[RES_PHI:%.*]] = phi i8* [ [[PTR]], [[BB1]] ], [ [[RES2]], [[BB2]] ]
616
+ ; INSTCOMBINEGVN-NEXT: store i8* null, i8** [[OBJ]], align 8
617
+ ; INSTCOMBINEGVN-NEXT: [[RES:%.*]] = select i1 [[COND2:%.*]], i8* [[RES_PHI]], i8* null
618
+ ; INSTCOMBINEGVN-NEXT: ret i8* [[RES]]
619
+ ;
620
+ entry:
621
+ %obj = alloca swifterror i8* , align 8
622
+ %obj2 = alloca swifterror i8* , align 8
623
+ call void @takeAddress (i8** swifterror %obj )
624
+ call void @takeAddress (i8** swifterror %obj2 )
625
+ store i8* %ptr , i8** %obj , align 8
626
+ br i1 %cond , label %bb1 , label %bb2
627
+
628
+ bb1: ; preds = %entry
629
+ %res1 = load i8* , i8** %obj , align 8
630
+ br label %exit
631
+
632
+ bb2: ; preds = %entry
633
+ %res2 = load i8* , i8** %obj2 , align 8
634
+ br label %exit
635
+
636
+ exit: ; preds = %bb2, %bb1
637
+ %res.phi = phi i8* [ %res1 , %bb1 ], [ %res2 , %bb2 ]
638
+ store i8* null , i8** %obj , align 8
639
+ %res = select i1 %cond2 , i8* %res.phi , i8* null
640
+ ret i8* %res
641
+ }
0 commit comments